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

Spring AOP方法內(nèi)部調(diào)用不生效的解決方案

 更新時間:2025年01月08日 09:00:29   作者:菜鳥日常  
最近有個需求,統(tǒng)計某個方法的調(diào)用次數(shù),開始使用 Spring AOP 實現(xiàn),后來發(fā)現(xiàn)當方法被內(nèi)部調(diào)用時,切面邏輯將不會生效,所以本文就給大家介紹了Spring AOP方法內(nèi)部調(diào)用不生效的解決方案,需要的朋友可以參考下

問題描述

最近有個需求,統(tǒng)計某個方法的調(diào)用次數(shù),開始使用 Spring AOP 實現(xiàn),后來發(fā)現(xiàn)當方法被內(nèi)部調(diào)用時,切面邏輯將不會生效,直接上樣例:

定義接口,包含方法 A,方法 B

public interface ISon {
    void A();
    void B();
}

定義接口實現(xiàn),方法 B 調(diào)用方法 A

@Service
public class Son implements ISon {
    @Override
    public void A() {
        System.out.println("method A");
    }
    @Override
    public void B() {
        System.out.println("method B");
        A();
    }
}

切點定義,對方法 A 進行增強

@Aspect
@Component
public class AspectDemo {

    @Pointcut(value = "execution(* com.example.transactiondemo.aop.ISon.A(..))")
    public void pointCut(){
    }

    @Before("pointCut()")
    public void before(JoinPoint joinPoint){
        System.out.println("before ");
    }

    @After("pointCut()")
    public void after(){
        System.out.println("after ");
    }

}

測試

@Autowired
private ISon iSon;

@Test
public void test11(){
    iSon.A();
    System.out.println("-----------");
    iSon.B();
}

打印輸出

before 
method A
after 
-----------
method B
method A

可以發(fā)現(xiàn),如果直接使用 實例調(diào)用 A,會進行增強;但是如果是方法 B 調(diào)用,A 的增強邏輯將失效。

失效原因

方法 A 被調(diào)用,是基于 AOP 生成的 代理對象 進行的調(diào)用;方法 B 調(diào)用方法 A ,是 this 目標對象 直接調(diào)用,并不是代理對象進行調(diào)用

5.8. Proxying Mechanisms

解決方案

回到最開始的需求,如何通過切面的方式獲取某一個方法的調(diào)用次數(shù)? 包括方法自調(diào)用

  • 使用 AopContext.currentProxy()

    切面開啟注解

@EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)

方法 B 不直接調(diào)用 A

    @Override
    public void B() {
        System.out.println("method B");
        ((Son) AopContext.currentProxy()).A();
    }

先獲取上下文的 Bean 再調(diào)用

@Autowired
private ApplicationContext applicationContext;

((Son) applicationContext.getBean(Son.class)).A();

以上就是Spring AOP方法內(nèi)部調(diào)用不生效的解決方案的詳細內(nèi)容,更多關于Spring AOP方法調(diào)用不生效的資料請關注腳本之家其它相關文章!

相關文章

  • java final 和instanceof 關鍵字的區(qū)別

    java final 和instanceof 關鍵字的區(qū)別

    這篇文章介紹了java final 和instanceof 關鍵字的區(qū)別,有需要的朋友可以參考一下
    2013-09-09
  • 淺談對象與Map相互轉化

    淺談對象與Map相互轉化

    這篇文章主要介紹了利用BeanMap進行對象與Map的相互轉換,在文中列舉了完整代碼,需要的朋友可以參考下。
    2017-09-09
  • Spring Security 實現(xiàn)短信驗證碼登錄功能

    Spring Security 實現(xiàn)短信驗證碼登錄功能

    這篇文章主要介紹了Spring Security 實現(xiàn)短信驗證碼登錄功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Java實現(xiàn)郵件發(fā)送功能

    Java實現(xiàn)郵件發(fā)送功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)郵件發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JavaWeb如何實現(xiàn)禁用瀏覽器緩存

    JavaWeb如何實現(xiàn)禁用瀏覽器緩存

    這篇文章主要介紹了JavaWeb如何實現(xiàn)禁用瀏覽器緩存,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java OpenCV4.0.0實現(xiàn)實時人臉識別

    Java OpenCV4.0.0實現(xiàn)實時人臉識別

    這篇文章主要為大家詳細介紹了Java OpenCV4.0.0實現(xiàn)實時人臉識別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java?synchronized與死鎖深入探究

    Java?synchronized與死鎖深入探究

    這篇文章主要介紹了Java?synchronized與死鎖,Java中提供了synchronized關鍵字,將可能引發(fā)安全問題的代碼包裹在synchronized代碼塊中,表示這些代碼需要進行線程同步
    2023-01-01
  • Spring實現(xiàn)文件上傳的配置詳解

    Spring實現(xiàn)文件上傳的配置詳解

    這篇文章將為大家詳細說明一下spring上傳文件如何配置,以及從request請求中解析到文件流的原理,文中示例代碼講解詳細,感興趣的可以了解一下
    2022-08-08
  • Java中的 BigDecimal 和 String 的相互轉換問題

    Java中的 BigDecimal 和 String 的相互轉換問題

    這篇文章主要介紹了Java中的 BigDecimal 和 String 的相互轉換問題,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • 通過代碼示例了解submit與execute的區(qū)別

    通過代碼示例了解submit與execute的區(qū)別

    這篇文章主要介紹了通過代碼示例了解submit與execute的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09

最新評論