成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

吃透動(dòng)態(tài)代理,解密spring AOP源碼(四)

Codeing_ls / 670人閱讀

摘要:值得一提的是由于采用動(dòng)態(tài)創(chuàng)建子類的方式生成代理對(duì)象,所以不能對(duì)目標(biāo)類中的方法進(jìn)行代理。動(dòng)態(tài)代理中生成的代理類是子類,調(diào)試的時(shí)候可以看到,打開源碼可看到實(shí)現(xiàn)了和也就實(shí)現(xiàn)方法。

前面講到了動(dòng)態(tài)代理的底層原理,接下來我們來看一下aop的動(dòng)態(tài)代理.
Spring AOP使用了兩種代理機(jī)制:一種是基于JDK的動(dòng)態(tài)代理,一種是基于CGLib的動(dòng)態(tài)代理.

①JDK動(dòng)態(tài)代理:使用JDK創(chuàng)建代理有一個(gè)限制,它只能為接口創(chuàng)建代理實(shí)例.這一點(diǎn)可以從Proxy的接口方法
newProxyInstance(ClassLoader loader,Class [] interfaces,InvocarionHandler h)中看的很清楚
第二個(gè)入?yún)?interfaces就是需要代理實(shí)例實(shí)現(xiàn)的接口列表.
②CGLib:采用底層的字節(jié)碼技術(shù),可以為一個(gè)類創(chuàng)建子類,在子類中采用方法攔截的技術(shù)攔截所有父類方法的調(diào)用
并順勢(shì)織入橫切邏輯.
③對(duì)比:CGLib所創(chuàng)建的動(dòng)態(tài)代理對(duì)象的性能比JDK的高大概10倍,但CGLib在創(chuàng)建代理對(duì)象的時(shí)間比JDK大概多8倍,所以對(duì)于singleton的代理對(duì)象或者具有實(shí)例池的代理,因?yàn)闊o需重復(fù)的創(chuàng)建代理對(duì)象,所以比較適合CGLib動(dòng)態(tài)代理技術(shù),反之選擇JDK代理。值得一提的是由于CGLib采用動(dòng)態(tài)創(chuàng)建子類的方式生成代理對(duì)象,所以不能對(duì)目標(biāo)類中final的方法進(jìn)行代理。

但是這種實(shí)現(xiàn)方式存在三個(gè)明顯需要改進(jìn)的地方:

a.目標(biāo)類的所有方法都添加了橫切邏輯,而有時(shí),這并不是我們所期望的,我們可能只希望對(duì)業(yè)務(wù)類中的某些特定的方法添加橫切邏輯;

b.我們通過硬編碼的方式制定了織入橫切邏輯的織入點(diǎn),即在目標(biāo)業(yè)務(wù)方法的開始和結(jié)束前織入代碼;

c.我們手工編寫代理實(shí)例的創(chuàng)建過程,為不同類創(chuàng)建代理時(shí),需要分別編寫相應(yīng)的創(chuàng)建代碼,無法做到通用;

還有一個(gè)問題是:spring依賴注入時(shí),什么時(shí)候會(huì)創(chuàng)建代理類,有時(shí)候是cglib有時(shí)候是jdkproxy有時(shí)候只是普通實(shí)例,有興趣的可以查閱資料,getBean依賴注入過程,可查看IOC源碼。

下面我們舉個(gè)例子看看aop事務(wù)注解是怎么實(shí)現(xiàn)的。
JDK動(dòng)態(tài)代理:aop中生成的代理類是JdkDynamicAopProxy子類,debug調(diào)試的時(shí)候可以看到,打開源碼可看到實(shí)現(xiàn)了AopProxy和invocationHandler也就實(shí)現(xiàn)invoke方法。
invoke關(guān)鍵代碼:

// Get the interception chain for this method.加載一系列的攔截器
List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

TransactionInterceptor是事務(wù)攔截器,所有帶有@Transactional注解的方法都會(huì)經(jīng)過攔截器invoke方法攔截,點(diǎn)進(jìn)方法里面可以發(fā)現(xiàn)代碼如下:

比如回滾方法點(diǎn)進(jìn)去發(fā)現(xiàn)是獲取事務(wù)管理器然后回滾

最后看下靜態(tài)代理,JDK動(dòng)態(tài)代理及cglib動(dòng)態(tài)代理的對(duì)比

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73769.html

相關(guān)文章

  • 吃透動(dòng)態(tài)代理,解密spring AOP源碼(二)

    摘要:緊接著上節(jié),為了解決靜態(tài)代理的問題,出現(xiàn)了動(dòng)態(tài)代理,假設(shè)動(dòng)態(tài)代理是一個(gè)代購公司,私有變量為動(dòng)態(tài)生成的具體的真實(shí)對(duì)象,可代購對(duì)應(yīng)的產(chǎn)品。這個(gè)注釋是說提供個(gè)一個(gè)靜態(tài)方法來創(chuàng)建代理類和代理實(shí)例,它也是所有由此方法創(chuàng)建的代理類的父類。 緊接著上節(jié),為了解決靜態(tài)代理的問題,出現(xiàn)了動(dòng)態(tài)代理, 假設(shè)動(dòng)態(tài)代理是一個(gè)代購公司,私有變量Object factory為動(dòng)態(tài)生成的具體的真實(shí)對(duì)象,可代購對(duì)應(yīng)的產(chǎn)...

    tianyu 評(píng)論0 收藏0
  • 吃透動(dòng)態(tài)代理,解密spring AOP源碼(三)

    摘要:對(duì)象什么時(shí)候被回收答可達(dá)性分析,當(dāng)發(fā)現(xiàn)某個(gè)類不被引用,類會(huì)被回收類的生命周期與動(dòng)態(tài)代理關(guān)系動(dòng)態(tài)代理是沒有源文件,直接生成字節(jié)碼的,加載到上面的。 上節(jié)講到動(dòng)態(tài)代理生成的類為$Proxy0,但是在我們項(xiàng)目里面卻不存在,實(shí)際我們是用了這個(gè)實(shí)現(xiàn)類調(diào)用了方法,想要知道這個(gè)問題,首先要理解類的完整生命周期. 類的完整生命周期 showImg(https://segmentfault.com/im...

    Coding01 評(píng)論0 收藏0
  • 源碼入手,一文帶你讀懂Spring AOP面向切面編程

    摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對(duì)應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。,織入,將作用在的過程。因?yàn)樵创a都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動(dòng)態(tài)代理嗎?看這篇就夠了》介紹了下...

    wawor4827 評(píng)論0 收藏0
  • 【好好面試】學(xué)完Aop,連動(dòng)態(tài)代理的原理都不懂?

    摘要:總結(jié)動(dòng)態(tài)代理的相關(guān)原理已經(jīng)講解完畢,接下來讓我們回答以下幾個(gè)思考題。 【干貨點(diǎn)】 此處是【好好面試】系列文的第12篇文章。文章目標(biāo)主要是通過原理剖析的方式解答Aop動(dòng)態(tài)代理的面試熱點(diǎn)問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進(jìn)而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認(rèn)代理類型是什么 為什么不用靜態(tài)代理 JDK動(dòng)態(tài)代理原理 CGLIB動(dòng)態(tài)代理...

    Keven 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<