spring AOP代理執(zhí)行@EnableAspectJAutoProxy的exposeProxy屬性詳解
前言
前面講到,以JDK動(dòng)態(tài)代理方式 的代理對(duì)象已經(jīng)創(chuàng)建成功,spring中 使用JDK動(dòng)態(tài)代理時(shí),傳入的InvokeHandler是JdkDynamicAopProxy類型。
并且數(shù)據(jù)結(jié)構(gòu)是這樣的
并且他的AdvisedSupport advised 屬性是 proxyFactory{
proxyFactory{ advisors :符合該類的所有的切面, targetSource:被代理目標(biāo)對(duì)象 proxyTargetClass :代理的方式 }
那么實(shí)現(xiàn)InvokeHandler接口,那么代理對(duì)象調(diào)用方法時(shí),就會(huì)調(diào)入Invoke方法 來進(jìn)行具體的增強(qiáng)。spring aop的具體代理邏輯就在這個(gè)方法中。
equals和hashCode方法不進(jìn)行代理
首先進(jìn)來會(huì)取出代理的目標(biāo)對(duì)象,this.advised.targetSource
然后進(jìn)行equals()和hashCode()的判斷,這兩個(gè)方法 是不會(huì)代理的,直接調(diào)用原生方法
@EnableAspectJAutoProxy配置exposeProxy=true,暴露代理對(duì)象
然后如果@EnableAspectJAutoProxy配置的exposeProxy為true的話,
@EnableAspectJAutoProxy(proxyTargetClass = false,exposeProxy = true)
會(huì)將代理對(duì)象提前放入 ThreadLocal里面,供代理過程中其他地方獲取
應(yīng)用場景
這個(gè)挺有用的。比如 某個(gè)類的 proxyMethodA() 和 proxyMethodB()都會(huì)命中切面,被代理。如果以下面proxyMethodA方法內(nèi)部直接 調(diào)用proxyMethodB()方法,
其實(shí) 調(diào)用的原生對(duì)象的proxyMethodB()方法,是不會(huì)走 proxyMethodB()的代理邏輯的。
@Component public class ProxyClass implements InterFace { public void proxyMethodA() { proxyMethodB(); } public void proxyMethodB() { } }
所以,我們要去獲取ProxyClass的代理對(duì)象來在proxyMethodA()的方法內(nèi)部 調(diào)用proxyMethodB()
注入自己的代理對(duì)象
一種是自己注入自己,那么肯定注入進(jìn)來的是代理對(duì)象,那么用代理對(duì)象去調(diào)用它的 proxyMethodB()方法,肯定是會(huì)走代理的。
@Component public class ProxyClass implements MyBeanService { @Autowired ProxyClass proxyClass; public void proxyMethodA() { // 注入進(jìn)來的是 proxyClass代理對(duì)象 proxyClass.proxyMethodB(); } public void proxyMethodB() { } }
AopContext.currentProxy()
還有一種就是 上面源碼里的AopContext.currentProxy()
會(huì)把代理對(duì)象放入ThreadLocal中,
直接在 proxyMethodA() 方法內(nèi)部AopContext.currentProxy()獲取到代理對(duì)象,然后調(diào)用它的proxyMethodB()
public class ProxyClass implements MyBeanService { public void proxyMethodA() { Object o = AopContext.currentProxy(); ((ProxyClass)o).proxyMethodB(); } public void proxyMethodB() { } }
以上就是spring AOP代理執(zhí)行@EnableAspectJAutoProxy的exposeProxy屬性詳解的詳細(xì)內(nèi)容,更多關(guān)于spring AOP執(zhí)行exposeProxy屬性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java中catalina.home與catalina.base區(qū)別點(diǎn)整理
在本篇文章里小編給大家整理的是關(guān)于java項(xiàng)目中catalina.home與catalina.base區(qū)別點(diǎn),需要的朋友們可以學(xué)習(xí)下。2020-02-02JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼
這篇文章主要介紹了JNI實(shí)現(xiàn)最簡單的JAVA調(diào)用C/C++代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08json-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例
下面小編就為大家?guī)硪黄猨son-lib將json格式的字符串,轉(zhuǎn)化為java對(duì)象的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03springboot中不能獲取post請(qǐng)求參數(shù)的解決方法
這篇文章主要介紹了springboot中不能獲取post請(qǐng)求參數(shù)的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06Javascript和Java語言有什么關(guān)系?兩種語言間的異同比較
雖然Javascript與Java有緊密的聯(lián)系,但卻是兩個(gè)公司開發(fā)的不同的兩個(gè)產(chǎn)品。那么js和java有什么關(guān)系,兩種語言的不同點(diǎn)是什么呢?介于這兩個(gè)問題,小編一起給大家解答下2016-09-09SpringBoot如何解析應(yīng)用參數(shù)args
文章主要介紹了SpringBoot啟動(dòng)過程中如何解析`main`函數(shù)中的參數(shù)`args`,包括如何解析命令行參數(shù)、訪問選項(xiàng)參數(shù)和非選項(xiàng)參數(shù),接著,介紹了`ApplicationArguments`接口及其方法,感興趣的朋友跟隨小編一起看看吧2024-11-11MyBatis自定義resultMap三種映射關(guān)系示例詳解
這篇文章主要介紹了MyBatis自定義resultMap三種映射關(guān)系,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08