一、基础
定义:是指为其他对象提供一种代理,以控制对这个对象的访问。代理对象在客户端和目标对象之间起到中介作用。属于结构型设计模式。
适用场景:保护目标对象;增加目标对象。
优点:代理模式能将代理对象与真实被调用的目标对象分离;一定程度上降低了系统的耦合程度,易于扩展;代理可以起到保护目标对象的作用;增强目标对象的职责。
缺点:会造成系统设计中类的数目增加;在客户端和目标对象之间增加了一个代理对象,请求处理速度变慢;增加了系统的复杂度。
Spring中的代理选择原则:
(1)、当Bean有实现接口时,Spring就会用JDK的动态代理;
(2)、当Bean没有实现接口时,Spring选择CGLib;
(3)、Spring可以通过配置强制使用CGLib,只需在Spring的配置文件中加入如下代码:<aop:aspectj-autoproxy proxy-target-class="true"/>。
二、静态代理
三、动态代理
1、JDK
2、Cglib
3、jdk动态代理与cglib动态代理的区别
1、JDK是采用读取接口的信息,CGLib覆盖父类方法,目的都是生成一个新的类,去实现增强代码逻辑的功能 。
2、JDK Proxy 对于用户而言,必须要有一个接口实现,目标类相对来说复杂;CGLib 可以代理任意一个普通的类,没有任何要求。
3、CGLib 生成代理逻辑更复杂,调用效率更高,生成一个包含了所有的逻辑的FastClass,不再需要反射调用;JDK Proxy生成代理的逻辑简单,执行效率相对要低,每次都要反射动态调用。
4、CGLib 有个坑,CGLib不能代理final的方法。
4、自己写一个动态代理
问:总结静态代理和动态代理的跟本区别。
答:静态代理:硬编码、手动注入,手动拿到目标对象的引用,手动调用代理目标的方法;
动态代理:具有更强的扩展性,自动注入,自动生成一个新的类(同一个继承体系)。
特征:拿到代理目标对象的引用,实现功能增强,保护目标对象。