国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Codeing_ls / 672人閱讀

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

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

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

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

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

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

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

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

下面我們舉個例子看看aop事務(wù)注解是怎么實(shí)現(xiàn)的。
JDK動態(tài)代理:aop中生成的代理類是JdkDynamicAopProxy子類,debug調(diào)試的時候可以看到,打開源碼可看到實(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注解的方法都會經(jīng)過攔截器invoke方法攔截,點(diǎn)進(jìn)方法里面可以發(fā)現(xiàn)代碼如下:

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

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

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73769.html

相關(guān)文章

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

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

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

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

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

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

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

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

    Keven 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<