代理模式总结
代理模式(Proxy Pattern):是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客服端和目标对象之间起到中介作用,代理模式属于结构型设计模式,有静态代理和动态代理。使用代理模式主要有两个目的:一保护目标对象,二增强目标对象。
1.静态代理

静态代理模式:代理对象通过实现同一接口,对被代理对象方法进行重写,从而实现接口的增强
缺点:无法动态的去实现方法代理,即被代理类对象新增方法时,代理类对象也必须的同时进行修改,这样会导致代理成本会很大
2.动态代理
动态代理和静态对比基本思路是一致的,只不过动态代理功能更加强大,补足了静态代理的缺点。动态代理实现方式有两种:一种是JDK动态代理,一种是CGLib动态代理
CGLib 和 JDK 动态代理对比**
1、JDK 动态代理是实现了被代理对象的接口,CGLib 是继承了被代理对象**。
2、JDK 和 CGLib 都是在运行期生成字节码,JDK 是直接写 Class 字节码,CGLib 使用ASM框架写 Class 字节码,Cglib 代理实现更复杂,生成代理类比 JDK 效率低。
3、JDK 调用代理方法,是通过反射机制调用,CGLib 是通过 FastClass 机制直接调用方法,CGLib 执行效率更高。
Spring 中的代理选择原则 **
1.当 Bean 有实现接口时,Spring 就会用 JDK 的动态代理
2.当 Bean 没有实现接口时,Spring 选择 CGLib。
3、Spring 可以通过配置强制使用 CGLib,只需在 Spring 的配置文件中加入如下代码:
<aop:aspectj-autoproxy proxy-target-class="true"/>
静态代理和动态的本质区别**
1、静态代理只能通过手动完成代理操作,如果被代理类增加新的方法,代理类需要同步新增,违背开闭原则。
2、动态代理采用在运行时动态生成代码的方式,取消了对被代理类的扩展限制,遵循开闭原则。
3、若动态代理要对目标类的增强逻辑扩展,结合策略模式,只需要新增策略类便可完成,无需修改代理类的代码。
代理模式的优缺点
使用代理模式具有以下几个优点:
1、代理模式能将代理对象与真实被调用的目标对象分离。
2、一定程度上降低了系统的耦合度,扩展性好。
3、可以起到保护目标对象的作用。
4、可以对目标对象的功能增强。
当然,代理模式也是有缺点的:
1、代理模式会造成系统设计中类的数量增加。
2、在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
3、增加了系统的复杂度。
【课堂笔记】深度分析代理模式.pdf
学习笔记链接
