欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

SpringAop

AOP代理織入時期

  • 編譯時織入 - aspectj框架
  • 類加載時織入 - aspectj框架
  • 運行時織入 - spring-aop

動態(tài)代理方式

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

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

方案一

通過編譯時織入或者類加載時織入代碼

方案二

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

getOne()方法中直接調(diào)用getAll()時是通過this對象,這時候getAll()方法上的@AopLog就不會被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()方法,這時候就是通過代理類調(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兩個方法,A方法中調(diào)用了B方法,執(zhí)行A方法時,B方法的代理沒有生效

問題剖析

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

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

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

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

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

相關(guān)文章

  • 詳解java中動態(tài)代理實現(xiàn)機制

    詳解java中動態(tài)代理實現(xiàn)機制

    這篇文章主要為大家介紹了java中動態(tài)代理實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Maven搭建springboot項目的方法步驟

    Maven搭建springboot項目的方法步驟

    這篇文章主要介紹了Maven搭建springboot項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達到80%或 90%。下面我們就來詳細學(xué)習(xí)下java單元測試吧
    2019-06-06
  • Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能

    Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能

    這篇文章主要介紹了Mybatis-plus如何通過反射實現(xiàn)動態(tài)排序不同字段功能,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Java中LambdaQueryWrapper的常用方法詳解

    Java中LambdaQueryWrapper的常用方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper常用方法的相關(guān)資料,lambdaquerywrapper是一個Java庫,用于構(gòu)建類型安全的Lambda表達式查詢,需要的朋友可以參考下
    2023-11-11
  • Java發(fā)送http請求的示例(get與post方法請求)

    Java發(fā)送http請求的示例(get與post方法請求)

    這篇文章主要介紹了Java發(fā)送http請求的示例(get與post方法請求),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • SpringBoot入門系列之JPA mysql

    SpringBoot入門系列之JPA mysql

    這篇文章主要介紹了SpringBoot入門系列之JPA mysql的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng))

    SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng))

    這篇文章主要介紹了SpringBoot之使用Redis實現(xiàn)分布式鎖(秒殺系統(tǒng)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • ANSI,Unicode,BMP,UTF等編碼概念實例講解

    ANSI,Unicode,BMP,UTF等編碼概念實例講解

    這篇文章主要介紹了ANSI,Unicode,BMP,UTF等編碼概念實例講解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Springboot集成fastDFS配置過程解析

    Springboot集成fastDFS配置過程解析

    這篇文章主要介紹了Springboot集成fastDFS配置過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11

最新評論