1.代理模式的定义
代理模式(ProxyPattern)是指为其他对象提供一种代理,以控制对这个对象的访问
代理对象在客户端和目标对象之间起到中介的作用
类型:结构型
2.代理适用场景
1.保护目标对象
2.增强目标对象
3.优点
1.代理模式能将代理对象与真实被调用的目标对象分离
2.一定成都上降低了系统耦合度,扩展性好
3.保护目标对象
4.增强目标对象,比如:before、after
4.缺点
1.代理模式会造成系统设计中类的数据增加
2.在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
3.增加系统复杂度
5.代理分类
1.静态代理:在代码中显示指定的代理
2.动态代理:只能对实现的接口的类进行代理,无法代理具体的类,程序调用到代理类对象时才由JVM真正创建,JVM根据传进来的业务实现类对象以及方法名动态的创建了一个代理类的class文件,并且class文件由字节码引擎执行,然后通过该代理类的对象进行方法调用。我们要做的就是把代理类里的实现写好,比如说before、after怎么写,这些都是目标对象的方法层次的增强。如果我们的业务实现类没有实现接口,而是直接调用业务方法就无法适用JDK的动态代理
3.CGLib代理:针对类实现进行代理。如果我们带一个类,CGLib会生成一个被代理类的子类,覆盖其中的方法,也就是通过继承和重写。如果这个类是fine的,这个类是不能被继承的,如果这个类不是fine,里面的方法是fine,那么这个方法也是无法被重写的
6.Spring代理选择
1.当Bean有实现接口时,spring就会用JDK的动态代理
2.当Bean没有实现接口时,spring使用CGlib
3.可以强制使用CGlib。在spring配置中加入:
<aop:aspectj-autoproxy proxy-target-class=“true”/>
7.AOP怎么实现运行时织入
调用方、目标对象、aop代理对象
代理aop实现的原理:目标对象委托代理对象来和客户端打交道,代理对象可以在执行目标对象的方法的前后做一些额外的操作
1.客户端是通过接口来引用对象或者目标对象的,体现了面向接口编程。因为客户端要调用的目标对象的方法代理对象都要有,因此目标对象跟代理对象共同作为这个接口的实现类
2.代理对象把真正的方法委托给目标对象来执行,自己就执行一些额外的逻辑,也就是aop要织入的逻辑
3.代码实现,创建三个类:
调用方接口类
目标对象类:实现调用方接口类,
aop代理对象类:实现调用方接口类+引用目标对象类+构造器强制传入目标对象类
8.动态代理-基于接口的JDK代理
1.类:java.lang.reflect.proxy。在main方法里生成动态代理的对象的Proxy.newProxyInstance()
2.接口:InvocationHandler。实现织入逻辑是实现这个接口,重写invoke方法,在该方法里用反射(result=method.invoke(目标对象类,args);)实现动态代理
3.只能基于接口进行动态代理
9.动态代理源码解析
1.Proxy.newProxyInstance
2.getProxyClass0、ProxyClassFactory、ProxyGenerator
3.newInstance
getProxyClass0:寻找指定的代理类,先从proxyClassCache缓存里取,如果缓存里没有就生成ProxyClassFactory一个放到缓存里
ProxyClassFactory:生成代理类