Spring中常用的设计模式:代理模式

代理模式

本质:控制对象访问

代理模式具有可扩展性:

  • 中介隔离作用。
  • 开闭原则,增加功能。

静态代理

静态代理是由我们自己创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。

  • 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

动态代理

动态代理是在程序运行时通过反射机制动态创建的。在动态代理中我们不再需要再手动的创建代理类,只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。

Spring AOP的代理模式

Spring AOP的底层是通过动态代理技术在运行期为目标Bean织入增强的代码

Spring使用了两种代理机制:

  • 基于JDK的动态代理:
    通过接口来实现方法拦截,必须确保要拦截的目标方法在接口中有定义,否则将无法实现拦截。
  • 基于CGLib的动态代理
    通过生成代理子类来实现方法拦截,必须确保要拦截的目标方法可被子类访问,也就是目标方法必须定义为非final,则非私有实例方法。
  • 两种代理机制的对比:
    CGLib所创建的动态代理对象的性能比JDK所创建的动态代理性能高(大概10倍)。但CGLib在创建代理对象时所花费的时间却比JDK动态代理多(大概8倍)。
  • 各自的使用场景:
    对于singleton的代理对象或者具有实例池的代理,因为无须频繁创建代理对象,所以比较适合采用CGLib动态代理技术;反之则适合采用JDK动态代理技术。

猜你喜欢

转载自blog.csdn.net/sinat_34341162/article/details/84110154