静态代理
优点:可以在不修改目标对象的前提下扩展目标对象的功能。
缺点:
冗余。由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。
动态代理
静态代理与动态代理的区别主要在:
静态代理在编译时就已经实现,编译完成后代理类是一个实际的class文件
动态代理是在运行时动态生成的,即编译完成后没有实际的class文件,而是在运行时动态生成类字节码,并加载到JVM中
SpringAOP会优先选择JDK动态代理,当调用方法不是接口方法时,就只能选择Cglib了
一、为什么不直接都使用JDK动态代理: JDK动态代理只能代理接口类,所以很多人设计架构的时候会使用 XxxService, XxxServiceImpl的形式设计,一是让接口和实现分离,二是也有助于代理。
二、为什么不都使用Cgilb代理: 因为JDK动态代理不依赖其他包,Cglib需要导入ASM包,对于简单的有接口的代理使用JDK动态代理可以少导入一个包。 cglib无法代理final方法。
网友评论