Spring——Spring AOP1(代理模式Proxy)

代理(Proxy)模式

1.创建工程

2.代理(Proxy)模式介绍

  • 作用:通过代理可以控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即: AOP的微观实现!)

  • 在这里插入图片描述

  • 核心角色

    • 抽象角色(接口):定义公共对外方法

    • 真实角色(周杰伦):实现抽象角色,定义真实角色所要实现的业务逻辑

    • 代理角色(代理人):实现抽象角色,是真实角色的代理,通过调用真实角色的方法来完成业务逻辑,并可以附加自己的操作

3.静态代理

3.1.抽象角色
package com.wt.proxy.StaticProxy;public interface Star {/*** 面谈*/void confer();/*** 签合同*/void signContract();/*** 订票*/void bookTicket();/*** 唱歌*/void sing();/*** 收钱*/void collectMoney();
}
3.2.真正角色(周杰伦)
package com.wt.proxy.StaticProxy;public class RealStar implements Star {public void bookTicket() {}public void collectMoney() {}public void confer() {}public void signContract() {}public void sing() {System.out.println("RealStar(周杰伦本人).sing()");}
}
3.3.代理角色(经纪人)
package com.wt.proxy.StaticProxy;public class ProxyStar implements Star {private Star star;public ProxyStar(Star star) {super();this.star = star;}public void bookTicket() {System.out.println("ProxyStar.bookTicket()");}public void collectMoney() {System.out.println("ProxyStar.collectMoney()");}public void confer() {System.out.println("ProxyStar.confer()");}public void signContract() {System.out.println("ProxyStar.signContract()");}public void sing() {star.sing();}
}
3.4.测试
package com.wt.proxy.StaticProxy;public class Client {public static void main(String[] args) {Star proxy = new ProxyStar(new RealStar());proxy.confer();proxy.signContract();proxy.bookTicket();proxy.sing();proxy.collectMoney();}
}
3.5.静态代理的缺点
  1. 代理类和实现类实现了相同的接口,这样就出现了大量的代码重复。
  2. 代理对象只服务于一种类型的对象。如果要服务多类型的对象,例如代码是只为UserService类的访问提供了代理,但是还要为其他类如DeptService类提供代理的话,就需要我们再次添加代理DeptService的代理类。

4.jdk动态代理

4.1.抽象角色
public interface Star {/*** 唱歌*/void sing();
}
4.2.真正角色(周杰伦)
package com.wt.JdkProxy;//真实角色(周杰伦)
public class RealStar implements Star {//优点:此时代码不再重复public void sing() {System.out.println("周杰伦:快使用双截棍,哼哼哈嘿....");}
}
4.3.代理角色(经纪人)
package com.wt.JdkProxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;//代理类工厂
public class ProxyFactory {//优点:此时可以代理任意类型的对象//真实角色(周杰伦)private Object realObj;public ProxyFactory(Object realObj) {this.realObj = realObj;}//获得代理对象public Object getProxyObject(){/*** Proxy:作用创建代理对象*      ClassLoader loader:类加载器*      Class<?>[] interfaces:真实角色实现的接口,根据接口生成代理类*      InvocationHandler h:增强的逻辑,即如何代理(宋吉吉要做的事)*/return Proxy.newProxyInstance(realObj.getClass().getClassLoader(),realObj.getClass().getInterfaces(),new InvocationHandler() {/**** @param proxy:代理类,一般不用* @param method:要调用的方法* @param args:调用方法时的参数* @return* @throws Throwable*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("真正的方法执行前!");System.out.println("面谈,签合同,预付款,订机票");Object result = method.invoke(realObj, args);System.out.println("真正的方法执行后!");System.out.println("收尾款");return result;}});}
}
4.4.测试
public class Client {public static void main(String[] args) {//获得代理对象Star proxyObject = (Star) new ProxyFactory(new RealStar()).getProxyObject();System.out.println(proxyObject.getClass());//class com.sun.proxy.$Proxy0proxyObject.sing();}
}

5.Cglib动态代理

cglib与动态代理最大的区别就是:

  • 使用jdk动态代理的对象必须实现一个接口
  • 使用cglib代理的对象则无需实现接口

CGLIB是第三方提供的包,所以需要引入jar包的坐标:

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.2.2</version>
</dependency>

如果你已经有spring-core的jar包,则无需引入,因为spring中包含了cglib。

5.1.真正角色
package com.wt.proxy.CglibProxy;public class RealStar{public void sing() {System.out.println("RealStar(周杰伦本人).sing()");}
}
5.2.代理角色(经纪人)
package com.wt.proxy.CglibProxy;import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;//代理工厂
public class ProxyFactory implements MethodInterceptor {//真实角色private Object realObj;public ProxyFactory(Object realObj) {this.realObj = realObj;}/**'* 获得子类代理对象* @return*/public Object getProxyObject() {//工具类Enhancer en = new Enhancer();//设置父类en.setSuperclass(realObj.getClass());//设置回调函数en.setCallback(this);//创建子类代理对象return en.create();}/*在子类中调用父类的方法intercept方法参数说明:obj : 代理对象method : 真实对象中的方法的Method实例args : 实际参数methodProxy :代理对象中的方法的method实例*/public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy)throws Throwable {System.out.println("真正的方法执行前!");System.out.println("面谈,签合同,预付款,订机票");Object result = method.invoke(realObj, args);System.out.println("真正的方法执行后!");System.out.println("收尾款");return object;}
}
5.3.测试
package com.by.proxy.CglibProxy;//测试类
public class Client {public static void main(String[] args) {//获取代理对象RealStar proxyObject = (RealStar) new ProxyFactory(new RealStar()).getProxyObject();proxyObject.sing();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GDI+更改背景颜色

GDI更改背景颜色 CRect rectDlg;GetClientRect(rectDlg);//获得窗体的大小Graphics graphics(this->GetDC()->m_hDC);//设置背景颜色Gdiplus::SolidBrush redBrush(Color(240 , 240 , 240));//填充背景graphics.FillRectangle(&redBrush, 0, 0, rectDlg.Width(), re…

C类网络地址段通过变长子网掩码划分3个局域网

现有一个C类网络地址段192.168.1.0/24&#xff0c;局域网1有30个主机&#xff0c;局域网2有20个主机&#xff0c;局域网3有10个主机&#xff0c;请使用变长子网掩码给三个子网分别分配IP地址。 解答&#xff1a;需要先划分数量小的局域网&#xff0c;我这里从局域网3开始划分。…

208.【2023年华为OD机试真题(C卷)】停车场车辆统计(贪心算法实现-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-停车场车辆统计二.解题思路三.题解代码Python题…

单片机原理及应用:中断服务函数

承接上文&#xff0c;今天我们来学习一下中断服务函数&#xff0c;对中断不了解的朋友可以回顾一下笔者之前的文章 中断系统结构与控制寄存器 中断服务函数是嵌入式系统中用于处理中断事件的函数&#xff0c;在原版的C语言中并不存在。当发生中断事件时&#xff0c;系统将会跳…

(vue)el-cascader级联选择器实现单/多选最后一级并回显

(vue)el-cascader实现多选最后一级并回显 <el-form-item label"选择算法模型&#xff1a;"><el-cascaderv-model"formInline.algorithmId":options"modelOptions":props"{ value: id, label: name, multiple: true, emitPath: fal…

计算机网络—— 概述

概述 1.1 因特网概述 网络、互联网和因特网 网络由若干结点和连接这些结点的链路组成多个网络还可以通过路由器互联起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网&#xff08;或互连网&#xff09;。因特网&#xff08;Internet&#xff09;是世…

C语言入门教程,C语言学习教程(第一部分:编程基础 )一

C语言是一门面向过程的编译型语言&#xff0c;它的运行速度极快&#xff0c;仅次于汇编语言。C语言是计算机产业的核心语言&#xff0c;操作系统、硬件驱动、关键组件、数据库等都离不开C语言&#xff1b;不学习C语言&#xff0c;就不能了解计算机底层。 这套「C语言入门教程」…

每日一练 | 华为认证真题练习Day161

1、OSPF STUB区域的ABR不向STUB区域内泛洪第五类LSA,第四类LSA和第三类LSA&#xff0c;因此STUB区域没有AS外部路由能力&#xff0c;STUB区域的ABR向区域内通告一条默认路由&#xff0c;指导发往AS外部的目的地。 A. 正确 B. 错误 2、OSPF直接运行于TCP协议之上&#xff0c;使…

ORACLE索引失效和sql优化

全部都是在开发中碰到的真实问题&#xff0c;后续会一直更新本条帖子&#xff1a; 场景一&#xff1a; 使用了函数&#xff0c;导致索引失效 交易日期过滤数据时使用了to_date写法&#xff0c;导致日期字段查询未走索引 将控制台输出的sql 粘贴到plsql 按F5打开解释计划执行窗口…

BeanUtils.copyProperties()

BeanUtils.copyProperties会进行类型转换&#xff1b; BeanUtils.copyProperties方法简单来说就是将两个字段相同的对象进行属性值的复制。 如果两个对象之间存在名称不相同的属性&#xff0c;则 BeanUtils 不对这些属性进行处理&#xff0c;需要程序手动处理。 这两个类在不同…

可碧教你C++——哈希

在文章的开始&#xff0c;先祝大家牢大年快乐 哈希的简介 unordered系列 在C11里&#xff0c;加入了两个新的container——unordered_set和unordered_map。 其使用方式与map和set类似&#xff0c;但是其底层实现则与其完全不同。set和map的底层数据结构为红黑树&#xff0c;…

Umbraco:从产品介绍到实战应用

一、产品介绍 Umbraco是一个开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;以其灵活性和可扩展性而闻名。Umbraco允许开发人员根据需要定制系统&#xff0c;同时为非技术人员提供了一个直观的界面来管理网站内容。Umbraco诞生于丹麦&#xff0c;经过多年的发展&a…

2023年阿里云云栖大会:前沿技术发布与未来展望

在2023年的阿里云云栖大会上&#xff0c;我见证了云计算和人工智能领域的又一历史性时刻。这次大会不仅是对未来科技趋势的一次深入探索&#xff0c;更是阿里云技术实力和创新能力的集中展示。 首先&#xff0c;千亿级参数规模的大模型通义千问2.0的发布&#xff0c;无疑将人工…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本&#xff0c;导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞&#xff0c;因此导致网络安全问题 伪方法&#xff1a; 像这个马上就暴露出Python版本&#xff0c;如何解决这个网络上有说直接用response.headers.remove(Ser…

Vim 粘贴内容时全变成注释的问题

在使用vim粘贴代码时&#xff0c;会出现注释代码后面的代码全被注释的情况。 解决办法&#xff1a; 进入paste模式&#xff0c;命令模式下输入&#xff1a; :set paste在paste模式下进行复制粘贴就变得很正常了。 解除paste模式&#xff0c;命令模式下输入&#xff1a; :se…

Mysql : command not found

1.Mysql : command not found 安装成功的mysql&#xff0c;并且服务已经启动&#xff0c;查看进行是可以看到的&#xff0c;但是使用命令登录操作&#xff0c;却抛出错误&#xff1a;command not found。 2.解决方案 2.1 查看/usr/bin目录下是否有mysql服务连接 ls /usr/bin…

Docker修改数据目录

在 Docker 中&#xff0c;可以通过修改 Docker 的配置文件来指定 overlay 文件系统的存储路径。Docker 使用 /var/lib/docker 作为默认的存储位置&#xff0c;但你可以更改这个位置&#xff0c;例如将其更改到一个具有更多可用空间的驱动器或分区上。以下是如何进行这项更改的步…

1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程

本篇文章主要讲解1panel中的sftpgo webadmin 更新修改docker容器文件的配置教程&#xff0c;适合sftpgo webadmin和1panel系统用户配置时使用。 作者&#xff1a;任聪聪 rccblogs.com 日期&#xff1a;2024年1月8日 sftpgo是无法直接直接更改容器内部的网站目录的&#xff0c;但…

Python进阶之元类

Python进阶之元类 目录 什么是元类&#xff1f; 元类的调用流程 根据类自定义元类 __new__方法以及参数 ----------cls ----------name ----------bases ----------attrs __call__方法 生成对象的完整代码 什么是元类&#xff1f; 在python面向对象中&#xff0c;我们知道所有…

AI大语言模型会带来了新一波人工智能浪潮?

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…