AOP面向切面编程,其极大的简化了代码的工作量受到了j2ee程序员的一致好评,分为静态代理和动态代理,静态代理主要是在启动时修改被代理类的字节码从而实现代理的效果,这里不做详述,主要分析下AOP动态代理。
首先看下AOP两种动态代理的区别:
1)JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成目标对象的代理。
2)CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象时针对目标类扩展的子类,CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。
优劣势比较:
1)JDK动态代理的性能不如CGLIB代理
2)JDK动态代理的被代理类必须是某个接口的实现,而CGLIB不用必须实现接口
3)JDK动态代理是jdk自带代理,可直接使用;使用CGLIB代理需要额外引入CGLIB库,甚至要在配置文件中配置(下面会详细说明)
AOP如何选择使用哪种代理:
1)如果被代理的目标对象实现了至少一个借口,则会使用JDK动态代理,所有该目标类型实现的接口都将被代理;
2)若该目标对象没有实现任何接口,则创建一个CGLIB代理;
3)强制使用CGLIB代理实现AOP:
a、添加CGLIB库,Spring_HOME/cglib/*.jar
b、在spring配置文件中加入 <aop:aspectj-autoproxy proxy-target-class="true"/>
JDK动态代理实现,请参考:http://blog.csdn.net/qq_21033663/article/details/78950714