一、功能比較
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方法會失敗