您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關JDK動態代理與CGLIB動態代理有什么區別,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
區別:
JDK是基于反射機制,生成一個實現代理接口的匿名類,然后重寫方法,實現方法的增強.
它生成類的速度很快,但是運行時因為是基于反射,調用后續的類操作會很慢.
而且他是只能針對接口編程的.
CGLIB是基于繼承機制,繼承被代理類,所以方法不要聲明為final,然后重寫父類方法達到增強了類的作用.
它底層是基于asm第三方框架,是對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理.
生成類的速度慢,但是后續執行類的操作時候很快.
可以針對類和接口.
性能上的區別:
因為jdk是基于反射,CGLIB是基于字節碼.所以性能上會有差異.
在老版本CGLIB的速度是JDK速度的10倍左右,但是CGLIB啟動類比JDK慢8倍左右,但是實際上JDK的速度在版本升級的時候每次都提高很多性能,而CGLIB仍止步不前.
在對JDK動態代理與CGlib動態代理的代碼實驗中看,1W次執行下,JDK7及8的動態代理性能比CGlib要好20%左右。
實現:
1、JDK動態代理商具體實現原理:
通過實現InvocationHandler接口創立自己的調使用解決器;
通過為Proxy類指定ClassLoader對象和一組interface來創立動態代理商;
通過反射機制獲取動態代理商類的構造函數,其唯一參數類型就是調使用解決器接口類型;
通過構造函數創立動態代理商類實例,構造時調使用解決器對象作為參數參入;
JDK動態代理商是面向接口的代理商模式,假如被代理商目標沒有接口那么Spring也無能為力,Spring通過Java的反射機制生產被代理商接口的新的匿名實現類,重寫了其中AOP的加強方法。
2、CGLib動態代理商:
CGLib是一個強大、高性能的Code生產類庫,可以實現運行期動態擴展java類,Spring在運行期間通過 CGlib繼承要被動態代理商的類,重寫父類的方法,實現AOP面向切面編程呢。
如何強制使用CGLIB實現AOP?
(1)添加CGLIB庫,SPRING_HOME/cglib/*.jar
(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
JDK動態代理和CGLIB字節碼生成的區別?
(1)JDK動態代理只能對實現了接口的類生成代理,而不能針對類
(2)CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法
因為是繼承,所以該類或方法最好不要聲明成final
總結:
Spring AOP中的JDK和CGLib動態代理商關于這個知識點很重要,關于兩者之間性能的比照經過測試試驗已經有了一個初步的結果,以后再有人問你Spring AOP,不要簡單的說JDK動態代理商和CGLib這兩個了,是時候的可以拋出來對兩者之間區別的了解,是有加分的哦!
關于JDK動態代理與CGLIB動態代理有什么區別就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。