這篇文章將為大家詳細講解有關(guān)JDK動態(tài)代理與CGLIB動態(tài)代理有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
十年的阿克塞哈薩克族自治網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整阿克塞哈薩克族自治建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“阿克塞哈薩克族自治網(wǎng)站設(shè)計”,“阿克塞哈薩克族自治網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
區(qū)別:
JDK是基于反射機制,生成一個實現(xiàn)代理接口的匿名類,然后重寫方法,實現(xiàn)方法的增強.
它生成類的速度很快,但是運行時因為是基于反射,調(diào)用后續(xù)的類操作會很慢.
而且他是只能針對接口編程的.
CGLIB是基于繼承機制,繼承被代理類,所以方法不要聲明為final,然后重寫父類方法達到增強了類的作用.
它底層是基于asm第三方框架,是對代理對象類的class文件加載進來,通過修改其字節(jié)碼生成子類來處理.
生成類的速度慢,但是后續(xù)執(zhí)行類的操作時候很快.
可以針對類和接口.
性能上的區(qū)別:
因為jdk是基于反射,CGLIB是基于字節(jié)碼.所以性能上會有差異.
在老版本CGLIB的速度是JDK速度的10倍左右,但是CGLIB啟動類比JDK慢8倍左右,但是實際上JDK的速度在版本升級的時候每次都提高很多性能,而CGLIB仍止步不前.
在對JDK動態(tài)代理與CGlib動態(tài)代理的代碼實驗中看,1W次執(zhí)行下,JDK7及8的動態(tài)代理性能比CGlib要好20%左右。
實現(xiàn):
1、JDK動態(tài)代理商具體實現(xiàn)原理:
通過實現(xiàn)InvocationHandler接口創(chuàng)立自己的調(diào)使用解決器;
通過為Proxy類指定ClassLoader對象和一組interface來創(chuàng)立動態(tài)代理商;
通過反射機制獲取動態(tài)代理商類的構(gòu)造函數(shù),其唯一參數(shù)類型就是調(diào)使用解決器接口類型;
通過構(gòu)造函數(shù)創(chuàng)立動態(tài)代理商類實例,構(gòu)造時調(diào)使用解決器對象作為參數(shù)參入;
JDK動態(tài)代理商是面向接口的代理商模式,假如被代理商目標沒有接口那么Spring也無能為力,Spring通過Java的反射機制生產(chǎn)被代理商接口的新的匿名實現(xiàn)類,重寫了其中AOP的加強方法。
2、CGLib動態(tài)代理商:
CGLib是一個強大、高性能的Code生產(chǎn)類庫,可以實現(xiàn)運行期動態(tài)擴展java類,Spring在運行期間通過 CGlib繼承要被動態(tài)代理商的類,重寫父類的方法,實現(xiàn)AOP面向切面編程呢。
如何強制使用CGLIB實現(xiàn)AOP?
(1)添加CGLIB庫,SPRING_HOME/cglib/*.jar
(2)在spring配置文件中加入
JDK動態(tài)代理和CGLIB字節(jié)碼生成的區(qū)別?
(1)JDK動態(tài)代理只能對實現(xiàn)了接口的類生成代理,而不能針對類
(2)CGLIB是針對類實現(xiàn)代理,主要是對指定的類生成一個子類,覆蓋其中的方法
因為是繼承,所以該類或方法最好不要聲明成final
總結(jié):
Spring AOP中的JDK和CGLib動態(tài)代理商關(guān)于這個知識點很重要,關(guān)于兩者之間性能的比照經(jīng)過測試試驗已經(jīng)有了一個初步的結(jié)果,以后再有人問你Spring AOP,不要簡單的說JDK動態(tài)代理商和CGLib這兩個了,是時候的可以拋出來對兩者之間區(qū)別的了解,是有加分的哦!
關(guān)于JDK動態(tài)代理與CGLIB動態(tài)代理有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。