這篇文章將為大家詳細(xì)講解有關(guān)JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
十年的阿克塞哈薩克族自治網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整阿克塞哈薩克族自治建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“阿克塞哈薩克族自治網(wǎng)站設(shè)計(jì)”,“阿克塞哈薩克族自治網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
區(qū)別:
JDK是基于反射機(jī)制,生成一個(gè)實(shí)現(xiàn)代理接口的匿名類(lèi),然后重寫(xiě)方法,實(shí)現(xiàn)方法的增強(qiáng).
它生成類(lèi)的速度很快,但是運(yùn)行時(shí)因?yàn)槭腔诜瓷?調(diào)用后續(xù)的類(lèi)操作會(huì)很慢.
而且他是只能針對(duì)接口編程的.
CGLIB是基于繼承機(jī)制,繼承被代理類(lèi),所以方法不要聲明為final,然后重寫(xiě)父類(lèi)方法達(dá)到增強(qiáng)了類(lèi)的作用.
它底層是基于asm第三方框架,是對(duì)代理對(duì)象類(lèi)的class文件加載進(jìn)來(lái),通過(guò)修改其字節(jié)碼生成子類(lèi)來(lái)處理.
生成類(lèi)的速度慢,但是后續(xù)執(zhí)行類(lèi)的操作時(shí)候很快.
可以針對(duì)類(lèi)和接口.
性能上的區(qū)別:
因?yàn)閖dk是基于反射,CGLIB是基于字節(jié)碼.所以性能上會(huì)有差異.
在老版本CGLIB的速度是JDK速度的10倍左右,但是CGLIB啟動(dòng)類(lèi)比JDK慢8倍左右,但是實(shí)際上JDK的速度在版本升級(jí)的時(shí)候每次都提高很多性能,而CGLIB仍止步不前.
在對(duì)JDK動(dòng)態(tài)代理與CGlib動(dòng)態(tài)代理的代碼實(shí)驗(yàn)中看,1W次執(zhí)行下,JDK7及8的動(dòng)態(tài)代理性能比CGlib要好20%左右。
實(shí)現(xiàn):
1、JDK動(dòng)態(tài)代理商具體實(shí)現(xiàn)原理:
通過(guò)實(shí)現(xiàn)InvocationHandler接口創(chuàng)立自己的調(diào)使用解決器;
通過(guò)為Proxy類(lèi)指定ClassLoader對(duì)象和一組interface來(lái)創(chuàng)立動(dòng)態(tài)代理商;
通過(guò)反射機(jī)制獲取動(dòng)態(tài)代理商類(lèi)的構(gòu)造函數(shù),其唯一參數(shù)類(lèi)型就是調(diào)使用解決器接口類(lèi)型;
通過(guò)構(gòu)造函數(shù)創(chuàng)立動(dòng)態(tài)代理商類(lèi)實(shí)例,構(gòu)造時(shí)調(diào)使用解決器對(duì)象作為參數(shù)參入;
JDK動(dòng)態(tài)代理商是面向接口的代理商模式,假如被代理商目標(biāo)沒(méi)有接口那么Spring也無(wú)能為力,Spring通過(guò)Java的反射機(jī)制生產(chǎn)被代理商接口的新的匿名實(shí)現(xiàn)類(lèi),重寫(xiě)了其中AOP的加強(qiáng)方法。
2、CGLib動(dòng)態(tài)代理商:
CGLib是一個(gè)強(qiáng)大、高性能的Code生產(chǎn)類(lèi)庫(kù),可以實(shí)現(xiàn)運(yùn)行期動(dòng)態(tài)擴(kuò)展java類(lèi),Spring在運(yùn)行期間通過(guò) CGlib繼承要被動(dòng)態(tài)代理商的類(lèi),重寫(xiě)父類(lèi)的方法,實(shí)現(xiàn)AOP面向切面編程呢。
如何強(qiáng)制使用CGLIB實(shí)現(xiàn)AOP?
(1)添加CGLIB庫(kù),SPRING_HOME/cglib/*.jar
(2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
JDK動(dòng)態(tài)代理和CGLIB字節(jié)碼生成的區(qū)別?
(1)JDK動(dòng)態(tài)代理只能對(duì)實(shí)現(xiàn)了接口的類(lèi)生成代理,而不能針對(duì)類(lèi)
(2)CGLIB是針對(duì)類(lèi)實(shí)現(xiàn)代理,主要是對(duì)指定的類(lèi)生成一個(gè)子類(lèi),覆蓋其中的方法
因?yàn)槭抢^承,所以該類(lèi)或方法最好不要聲明成final
總結(jié):
Spring AOP中的JDK和CGLib動(dòng)態(tài)代理商關(guān)于這個(gè)知識(shí)點(diǎn)很重要,關(guān)于兩者之間性能的比照經(jīng)過(guò)測(cè)試試驗(yàn)已經(jīng)有了一個(gè)初步的結(jié)果,以后再有人問(wèn)你Spring AOP,不要簡(jiǎn)單的說(shuō)JDK動(dòng)態(tài)代理商和CGLib這兩個(gè)了,是時(shí)候的可以?huà)伋鰜?lái)對(duì)兩者之間區(qū)別的了解,是有加分的哦!
關(guān)于JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
文章名稱(chēng):JDK動(dòng)態(tài)代理與CGLIB動(dòng)態(tài)代理有什么區(qū)別
網(wǎng)址分享:http://chinadenli.net/article18/jeepdp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、定制開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)、軟件開(kāi)發(fā)、網(wǎng)站排名、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)