摘要:值得一提的是由于采用動態創建子類的方式生成代理對象,所以不能對目標類中的方法進行代理。動態代理中生成的代理類是子類,調試的時候可以看到,打開源碼可看到實現了和也就實現方法。
前面講到了動態代理的底層原理,接下來我們來看一下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
TransactionInterceptor是事務攔截器,所有帶有@Transactional注解的方法都會經過攔截器invoke方法攔截,點進方法里面可以發現代碼如下:
比如回滾方法點進去發現是獲取事務管理器然后回滾
最后看下靜態代理,JDK動態代理及cglib動態代理的對比
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73769.html
摘要:緊接著上節,為了解決靜態代理的問題,出現了動態代理,假設動態代理是一個代購公司,私有變量為動態生成的具體的真實對象,可代購對應的產品。這個注釋是說提供個一個靜態方法來創建代理類和代理實例,它也是所有由此方法創建的代理類的父類。 緊接著上節,為了解決靜態代理的問題,出現了動態代理, 假設動態代理是一個代購公司,私有變量Object factory為動態生成的具體的真實對象,可代購對應的產...
摘要:對象什么時候被回收答可達性分析,當發現某個類不被引用,類會被回收類的生命周期與動態代理關系動態代理是沒有源文件,直接生成字節碼的,加載到上面的。 上節講到動態代理生成的類為$Proxy0,但是在我們項目里面卻不存在,實際我們是用了這個實現類調用了方法,想要知道這個問題,首先要理解類的完整生命周期. 類的完整生命周期 showImg(https://segmentfault.com/im...
摘要:,,面向切面編程。,切點,切面匹配連接點的點,一般與切點表達式相關,就是切面如何切點。例子中,注解就是切點表達式,匹配對應的連接點,通知,指在切面的某個特定的連接點上執行的動作。,織入,將作用在的過程。因為源碼都是英文寫的。 之前《零基礎帶你看Spring源碼——IOC控制反轉》詳細講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動態代理嗎?看這篇就夠了》介紹了下...
摘要:總結動態代理的相關原理已經講解完畢,接下來讓我們回答以下幾個思考題。 【干貨點】 此處是【好好面試】系列文的第12篇文章。文章目標主要是通過原理剖析的方式解答Aop動態代理的面試熱點問題,通過一步步提出問題和了解原理的方式,我們可以記得更深更牢,進而解決被面試官卡住喉嚨的情況。問題如下 SpringBoot默認代理類型是什么 為什么不用靜態代理 JDK動態代理原理 CGLIB動態代理...
閱讀 2230·2021-09-24 10:31
閱讀 3880·2021-09-22 15:16
閱讀 3400·2021-09-22 10:02
閱讀 1016·2021-09-22 10:02
閱讀 1832·2021-09-08 09:36
閱讀 1978·2019-08-30 14:18
閱讀 612·2019-08-30 10:51
閱讀 1870·2019-08-29 11:08