一、定义

  代理模式是为其他对象提供一种代理,来控制对这个对象的访问。代理对象在客户端与目标对象之间起到中介作用。数据结构型设计模式。

二、作用

  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