文章目录
代理模式
本质:控制对象访问
代理模式具有可扩展性:
- 中介隔离作用。
- 开闭原则,增加功能。
静态代理
静态代理是由我们自己创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类.class文件就已经被创建了。
- 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
动态代理
动态代理是在程序运行时通过反射机制动态创建的。在动态代理中我们不再需要再手动的创建代理类,只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。
Spring AOP的代理模式
Spring AOP的底层是通过动态代理技术在运行期为目标Bean织入增强的代码。
Spring使用了两种代理机制:
- 基于JDK的动态代理:
通过接口来实现方法拦截,必须确保要拦截的目标方法在接口中有定义,否则将无法实现拦截。 - 基于CGLib的动态代理
通过生成代理子类来实现方法拦截,必须确保要拦截的目标方法可被子类访问,也就是目标方法必须定义为非final,则非私有实例方法。 - 两种代理机制的对比:
CGLib所创建的动态代理对象的性能比JDK所创建的动态代理性能高(大概10倍)。但CGLib在创建代理对象时所花费的时间却比JDK动态代理多(大概8倍)。 - 各自的使用场景:
对于singleton的代理对象或者具有实例池的代理,因为无须频繁创建代理对象,所以比较适合采用CGLib动态代理技术;反之则适合采用JDK动态代理技术。