最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過代理類的問題

 更新時(shí)間:2022年01月03日 10:52:08   作者:luckyman98  
這篇文章主要介紹了解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過代理類的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

SpringAop

AOP代理織入時(shí)期

  • 編譯時(shí)織入 - aspectj框架
  • 類加載時(shí)織入 - aspectj框架
  • 運(yùn)行時(shí)織入 - spring-aop

動(dòng)態(tài)代理方式

  • JDK - 被代理對(duì)象必須需要實(shí)現(xiàn)接口
  • CGLIB - 采用繼承被代理對(duì)象方式實(shí)現(xiàn)代理功能

解決SpringAop內(nèi)部調(diào)用時(shí)不經(jīng)過代理類(而是通過this)

方案一

通過編譯時(shí)織入或者類加載時(shí)織入代碼

方案二

通過當(dāng)前代理類調(diào)用目標(biāo)方法

getOne()方法中直接調(diào)用getAll()時(shí)是通過this對(duì)象,這時(shí)候getAll()方法上的@AopLog就不會(huì)被AOP掃描到

@Service
@Slf4j
public class ServiceImpl implements IService {
? ? @Override
? ? @AopLog("value=getOne")
? ? public void getOne() {
? ? ? ? log.info("getOne running");
? ? ? ? // 直接調(diào)用getAll()方法 = this.getAll()
? ? ? ? getAll();
? ? }
? ? @Override
? ? @AopLog("value=getAll")
? ? public void getAll() {
? ? ? ? log.info("getAll running");
? ? }
}

修改getOne()方法,通過AopContext.currentProxy()方法獲取當(dāng)前代理類,通過代理類來調(diào)用getAll()方法,這時(shí)候就是通過代理類調(diào)用的

@Service
@Slf4j
public class ServiceImpl implements IService {
? ? @Override
? ? @AopLog("value=getOne")
? ? public void getOne() {
? ? ? ? log.info("getOne running");
? ? ? ? // 獲取當(dāng)前代理類,通過代理類來調(diào)用getAll()方法
? ? ? ? ((IService) AopContext.currentProxy()).getAll();
? ? }
? ? @Override
? ? @AopLog("value=getAll")
? ? public void getAll() {
? ? ? ? log.info("getAll running");
? ? }
? ? @AopLog("value=getById")
? ? private void getById() {
? ? ? ? log.info("getById running");
? ? }
}

this使得SpringAop失效之謎

問題描述

類Demo被AOP掃描到,其中有A和B兩個(gè)方法,A方法中調(diào)用了B方法,執(zhí)行A方法時(shí),B方法的代理沒有生效

問題剖析

我們知道AOP底層使用JDK動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理想結(jié)合,通過判斷去創(chuàng)建對(duì)應(yīng)的代理對(duì)象。

而不管是那種方法,最終執(zhí)行完代理后,都會(huì)執(zhí)行目標(biāo)方法:method.invoke(target,agrs)-->傳入目標(biāo)對(duì)象

所以執(zhí)行A方法的代理后,執(zhí)行A的目標(biāo)方法,此時(shí)執(zhí)行的對(duì)象是目標(biāo)對(duì)象,所以目標(biāo)對(duì)象執(zhí)行A方法是A中隱藏的this

指的就是目標(biāo)對(duì)象,即執(zhí)行B方法的不再是代理對(duì)象而是目標(biāo)對(duì)象,故B方法不會(huì)被代理

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問題

    YYYY-MM-dd可能會(huì)導(dǎo)致跨年周的日期被歸屬到錯(cuò)誤的年份, yyyy-MM-dd總是表示實(shí)際的日歷年份,無論日期所在的周是否跨年,本文就來介紹一下兩者的區(qū)別,感興趣的可以了解一下
    2024-01-01
  • 使用java數(shù)組 封裝自己的數(shù)組操作示例

    使用java數(shù)組 封裝自己的數(shù)組操作示例

    這篇文章主要介紹了使用java數(shù)組 封裝自己的數(shù)組操作,結(jié)合實(shí)例形式分析了java數(shù)組索引、遍歷等相關(guān)封裝操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 將idea中xml文件背景顏色去除的圖文教程

    將idea中xml文件背景顏色去除的圖文教程

    這篇文章主要介紹了將idea中xml文件背景顏色去除,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java實(shí)現(xiàn)將數(shù)組的元素用逗號(hào)連接的多種方法

    Java實(shí)現(xiàn)將數(shù)組的元素用逗號(hào)連接的多種方法

    在 Java 開發(fā)中,我們經(jīng)常需要將數(shù)組中的元素用逗號(hào)連接成一個(gè)字符串,這種需求在日志記錄、數(shù)據(jù)導(dǎo)出、API 響應(yīng)等場(chǎng)景中非常常見,本文將詳細(xì)介紹如何在 Java 中實(shí)現(xiàn)這一功能,并提供多種簡(jiǎn)潔的方法和優(yōu)化建議,需要的朋友可以參考下
    2025-01-01
  • springboot整合持久層的方法實(shí)現(xiàn)

    springboot整合持久層的方法實(shí)現(xiàn)

    本文主要介紹了springboot整合持久層的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Java main 方法面試題的詳細(xì)整理

    Java main 方法面試題的詳細(xì)整理

    這篇文章主要介紹了Java main 方法面試題的詳細(xì)整理的相關(guān)資料,這里介紹了10個(gè)經(jīng)典面試題的方法,需要的朋友可以參考下
    2017-09-09
  • 聊聊spring繼承的問題

    聊聊spring繼承的問題

    這篇文章主要介紹了spring繼承的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解

    Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解

    這篇文章主要介紹了Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • common-upload上傳文件功能封裝類分享

    common-upload上傳文件功能封裝類分享

    本文介紹一個(gè)common-upload上傳封裝類,為了更方便的上傳文件,對(duì)common-upload進(jìn)行了一個(gè)簡(jiǎn)單的封裝,大家參考使用吧
    2014-01-01
  • Netty啟動(dòng)流程注冊(cè)多路復(fù)用源碼解析

    Netty啟動(dòng)流程注冊(cè)多路復(fù)用源碼解析

    這篇文章主要介紹了Netty啟動(dòng)流程注冊(cè)多路復(fù)用源碼分析,繼續(xù)分析channel是如何注冊(cè)到selector中的,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-03-03

最新評(píng)論

郯城县| 中江县| 阿巴嘎旗| 胶南市| 阳新县| 炎陵县| 建始县| 莲花县| 佛冈县| 晋江市| 高密市| 海晏县| 青冈县| 天等县| 安宁市| 民乐县| 上思县| 德格县| 特克斯县| 隆尧县| 江永县| 祁连县| 怀仁县| 彰化县| 安国市| 岐山县| 老河口市| 横峰县| 沙河市| 盐源县| 海阳市| 东光县| 青田县| 台南市| 布尔津县| 南漳县| 清水河县| 资中县| 五原县| 高要市| 德清县|