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

資訊專欄INFORMATION COLUMN

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

Codeing_ls / 666人閱讀

摘要:值得一提的是由于采用動態創建子類的方式生成代理對象,所以不能對目標類中的方法進行代理。動態代理中生成的代理類是子類,調試的時候可以看到,打開源碼可看到實現了和也就實現方法。

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

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

但是這種實現方式存在三個明顯需要改進的地方:

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

b.我們通過硬編碼的方式制定了織入橫切邏輯的織入點,即在目標業務方法的開始和結束前織入代碼

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

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

下面我們舉個例子看看aop事務注解是怎么實現的。
JDK動態代理:aop中生成的代理類是JdkDynamicAopProxy子類,debug調試的時候可以看到,打開源碼可看到實現了AopProxy和invocationHandler也就實現invoke方法。
invoke關鍵代碼:

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

TransactionInterceptor是事務攔截器,所有帶有@Transactional注解的方法都會經過攔截器invoke方法攔截,點進方法里面可以發現代碼如下:

比如回滾方法點進去發現是獲取事務管理器然后回滾

最后看下靜態代理,JDK動態代理及cglib動態代理的對比

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73769.html

相關文章

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

    摘要:緊接著上節,為了解決靜態代理的問題,出現了動態代理,假設動態代理是一個代購公司,私有變量為動態生成的具體的真實對象,可代購對應的產品。這個注釋是說提供個一個靜態方法來創建代理類和代理實例,它也是所有由此方法創建的代理類的父類。 緊接著上節,為了解決靜態代理的問題,出現了動態代理, 假設動態代理是一個代購公司,私有變量Object factory為動態生成的具體的真實對象,可代購對應的產...

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

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

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

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

    wawor4827 評論0 收藏0
  • 【好好面試】學完Aop,連動態代理的原理都不懂?

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

    Keven 評論0 收藏0

發表評論

0條評論

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