内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

SpringAOP中JDK和CGLib動態(tài)代理哪個更快?-創(chuàng)新互聯(lián)

一、背景

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),邵原企業(yè)網(wǎng)站建設(shè),邵原品牌網(wǎng)站建設(shè),網(wǎng)站定制,邵原網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,邵原網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

昨天一位小伙伴面試的時候被問到:Spring AOP中JDK和CGLib動態(tài)代理哪個效率更高?在知識星球整理了一下,今天特分享出來,供大家參考!

二、基本概念

首先,我們知道Spring AOP的底層實現(xiàn)有兩種方式:一種是JDK動態(tài)代理,另一種是CGLib的方式。

自Java 1.3以后,Java提供了動態(tài)代理技術(shù),允許開發(fā)者在運行期創(chuàng)建接口的代理實例,后來這項技術(shù)被用到了Spring的很多地方。

JDK動態(tài)代理主要涉及java.lang.reflect包下邊的兩個類:Proxy和InvocationHandler。其中,InvocationHandler是一個接口,可以通過實現(xiàn)該接口定義橫切邏輯,并通過反射機制調(diào)用目標(biāo)類的代碼,動態(tài)地將橫切邏輯和業(yè)務(wù)邏輯編織在一起。

JDK動態(tài)代理的話,他有一個限制,就是它只能為接口創(chuàng)建代理實例,而對于沒有通過接口定義業(yè)務(wù)方法的類,如何創(chuàng)建動態(tài)代理實例哪?答案就是CGLib。

CGLib采用底層的字節(jié)碼技術(shù),全稱是:Code Generation Library,CGLib可以為一個類創(chuàng)建一個子類,在子類中采用方法攔截的技術(shù)攔截所有父類方法的調(diào)用并順勢織入橫切邏輯。

三、JDK 和 CGLib動態(tài)代理區(qū)別

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)代理是面向接口的代理模式,如果被代理目標(biāo)沒有接口那么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面向切面編程呢。

3、兩者對比:

  • JDK動態(tài)代理是面向接口的。

  • CGLib動態(tài)代理是通過字節(jié)碼底層繼承要代理類來實現(xiàn)(如果被代理類被final關(guān)鍵字所修飾,那么抱歉會失?。?/p>

4、使用注意:

  • 如果要被代理的對象是個實現(xiàn)類,那么Spring會使用JDK動態(tài)代理來完成操作(Spirng默認(rèn)采用JDK動態(tài)代理實現(xiàn)機制);

  • 如果要被代理的對象不是個實現(xiàn)類那么,Spring會強制使用CGLib來實現(xiàn)動態(tài)代理。

四、JDK 和 CGLib動態(tài)代理性能對比-教科書上的描述

我們不管是看書還是看文章亦或是我那個上搜索參考答案,可能很多時候,都可以找到如下的回答:

關(guān)于兩者之間的性能的話,JDK動態(tài)代理所創(chuàng)建的代理對象,在以前的JDK版本中,性能并不是很高,雖然在高版本中JDK動態(tài)代理對象的性能得到了很大的提升,但是他也并不是適用于所有的場景。主要體現(xiàn)在如下的兩個指標(biāo)中:

1、CGLib所創(chuàng)建的動態(tài)代理對象在實際運行時候的性能要比JDK動態(tài)代理高不少,有研究表明,大概要高10倍;

2、但是CGLib在創(chuàng)建對象的時候所花費的時間卻比JDK動態(tài)代理要多很多,有研究表明,大概有8倍的差距;

3、因此,對于singleton的代理對象或者具有實例池的代理,因為無需頻繁的創(chuàng)建代理對象,所以比較適合采用CGLib動態(tài)代理,反正,則比較適用JDK動態(tài)代理。

結(jié)果是不是如上邊1、2、3條描述的那樣哪?下邊我們做一些小實驗分析一下!

五、性能測試

1、首先有幾個Java類

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

2、Target.java

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

3、TargetImpl.java

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

4、JdkDynamicProxyTest.java

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

5、CglibProxyTest.java

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

6、ProxyPerformanceTest.java

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

7、測試結(jié)果

(1)JDK 1.6

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

(2)JDK 1.7

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

(3)JDK 1.8

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

經(jīng)過多次試驗,可以看出平均情況下的話,JDK動態(tài)代理的運行速度已經(jīng)逐漸提高了,在低版本的時候,運行的性能可能不如CGLib,但是在1.8版本中運行多次,基本都可以得到一致的測試結(jié)果,那就是JDK動態(tài)代理已經(jīng)比CGLib動態(tài)代理快了!

但是JDK動態(tài)代理和CGLib動態(tài)代理的適用場景還是不一樣的哈!

六、總結(jié)

最終的測試結(jié)果大致是這樣的,在1.6和1.7的時候,JDK動態(tài)代理的速度要比CGLib動態(tài)代理的速度要慢,但是并沒有教科書上的10倍差距,在JDK1.8的時候,JDK動態(tài)代理的速度已經(jīng)比CGLib動態(tài)代理的速度快很多了,希望小伙伴在遇到這個問題的時候能夠有的放矢!

Spring AOP中的JDK和CGLib動態(tài)代理關(guān)于這個知識點很重要,關(guān)于兩者之間性能的對比經(jīng)過測試實驗已經(jīng)有了一個初步的結(jié)果,以后再有人問你Spring AOP,不要簡單的說JDK動態(tài)代理和CGLib這兩個了,是時候的可以拋出來對兩者之間區(qū)別的理解,是有加分的哦!

點擊獲取?附送學(xué)習(xí)進(jìn)階架構(gòu)資料、PDF書籍文檔、面試資料

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

Spring AOP中JDK和CGLib動態(tài)代理哪個更快?

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

名稱欄目:SpringAOP中JDK和CGLib動態(tài)代理哪個更快?-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://www.rwnh.cn/article20/cejsjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作網(wǎng)站排名、網(wǎng)站建設(shè)、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司
射洪县| 来安县| 新竹市| 永福县| 聂拉木县| 南部县| 乌鲁木齐市| 东兴市| 寿光市| 孝昌县| 昆山市| 海宁市| 石狮市| 芜湖县| 板桥市| 汪清县| 井研县| 惠东县| 新邵县| 岚皋县| 西藏| 彰化县| 吐鲁番市| 城步| 天长市| 阳信县| 嘉荫县| 常德市| 长丰县| 泰和县| 武汉市| 阿荣旗| 历史| 乐平市| 庄浪县| 阿勒泰市| 鄂尔多斯市| 冀州市| 慈利县| 朔州市| 利辛县|