一、定义
代理模式是为其他对象提供一种代理,来控制对这个对象的访问。代理对象在客户端与目标对象之间起到中介作用。数据结构型设计模式。
二、作用
1.保护目标对象
2.增强目标对象
三、两种代理模式
静态代理:显示声明被代理对象
动态代理:可以动态配置和替换被代理对象,使用更为灵活
区别:
静态代理编译期间生成代理类(适用性差且难扩展,违背开闭原则),动态代理运行期间生成代理类(实用性好且易扩展);
四、JDK动态代理生成对象步骤(原理)
1.通过反射获取到被代理对象的引用,并且获取到它的所有接口
2.重新生成一个新的类,同时新的类要实现被代理类实现的所有接口
3.动态生成java代码,并把新加的业务逻辑方法加好
4.编译新生成的代码.class
5.再重新加载到JVM中运行,生成的对象就是代理对象
五、JDK与CGLib(第三方类库)动态代理区别
1.JDK是通过实现被代理对象接口,CGLib是实现了被代理对象
2.JDK和CGLib都是在运行期生成字节码,JDK是直接写class字节码,CGLib是使用ASM框架写字节码,CGLib的实现更为复杂,效率低。
3.JDK调用代理方法是通过反射机制调用,CGLib是通过FastClass机制直接调用,CGLib效率更高
六、代理模式优点
代理模式能够将目标对象与代理对象相分离
一定程度上降低了系统的耦合程度,便于扩展
保护了目标对象
增强目标对象的职责
七、缺点
造成系统中类的数目增加
在客户端与目标对象之间增加了一个代理对象,会造成请求处理速度变慢
增加了系统的复杂度
八、spring中的aop就是通过代理模式实现,两个重要的实现类是 JdkDynamicAopProxy和CGLibaopProxy,spring中的代理选择原则
1.当bean有实现接口时,Spring就会用JDK的动态代理,反之~
2.spring可通过配置强制使用CGLib