一、功能比较
1、JDK动态代理是基于接口的,要求被代理的类必须实现一个接口。
2、CGLIB通过继承方式代理目标类,要求目标类不能是final的。
二、性能比较
1、采用JDK8进行一千万次的测试:
JDK动态代理:152836ms
CGLIB:154783ms
可以得出结论:在JDK8下面JDK动态代理的性能是优于CGLIB的
三、Spring使用二者的顺序
1、有接口的情况下,AOP 默认使用 JDK 动态代理
2、如果没有接口的情况下,只能使用CGLIB
3、如果强制使用CGLIB,则需要在Spring的配置文件中设置proxy-target-class = true
<aop:aspectj-autoproxy proxy-target-class="true"/>
四、注意事项
1、Spring AOP不支持代理类内部方法调用的拦截,比如类中a方法调用b方法,切面拦截b方法会失败