一、原理差別:
java動态代理是利用反射機制生成一個實作代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。
而cglib動态代理是利用asm開源包,對代理對象類的class檔案加載進來,通過修改其位元組碼生成子類來處理。
1、如果目标對象實作了接口,預設情況下會采用JDK的動态代理實作AOP
2、如果目标對象實作了接口,可以強制使用CGLIB實作AOP
3、如果目标對象沒有實作了接口,必須采用CGLIB庫,spring會自動在JDK動态代理和CGLIB之間轉換
如何強制使用CGLIB實作AOP?
(1)添加CGLIB庫,SPRING_HOME/cglib/*.jar
(2)在spring配置檔案中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
JDK動态代理和CGLIB位元組碼生成的差別?
(1)JDK動态代理隻能對實作了接口的類生成代理,而不能針對類
(2)CGLIB是針對類實作代理,主要是對指定的類生成一個子類,覆寫其中的方法
因為是繼承,是以該類或方法最好不要聲明成final
二、代碼實作
使用者管理接口
使用者管理接口實作類
JDK動态代理
JDK動态代理運作結果
Cglib動态代理(需要導入兩個jar包,asm-5.2.jar,cglib-3.2.5.jar。版本自行選擇)
Cglib動态代理運作結果
有什麼問題可以留言讨論!