JDK動態代理與cglib區別:
代理模式(之前的博客寫過): https://mp.csdn.net/postedit/82844237
代理類和被代理類實現相同的接口。利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用invokeHandler來處理。
cglib:
利用asm開源包,對代理對象類的class加載進來,通過修改其字節碼生成子類來處理,所以比動態代理快。採用的繼承,所以不能對final修飾的類進行代理。
所以
JDK動態代理只能對實現了接口的類生成代理,而不能針對類。
CGLIB是針對類實現代理,主要對指定的類生成一個子類,覆蓋其中的方法(繼承)。
那麼Spring如何選擇使用動態代理還是cglib:(實現AOP)
(1)當Bean實現接口時,使用JDK的動態代理
(2)當Bean沒有實現接口時,使用cglib,spring會自動在jdk動態代理和cglib之間轉換
(3)可以強制使用cglib,添加cglib庫,jar包 SPRING_HOME/cglib/*.jar,配置文件加入<aop:aspectj-autoproxy proxy-target-class="true"/>
參考: