簡體   English   中英

Spring bean() 切入點不適用於 OR 語句

[英]Spring bean() pointcut doesn't work with OR statement

我正在使用稱為 bean() 的 Spring 特定切入點表達式。 對於以下表達式,僅捕獲左側部分:

@AfterReturning("bean(FirstService).firstMethod(..) || bean(SecondService).secondMethod(..)")

如果我倒車,左側部分將再次被捕獲:

@AfterReturning("bean(SecondService).secondMethod(..) || bean(FirstService).firstMethod(..)")

如果我寫:

@AfterReturning("bean(SecondService).secondMethod(..)")

@AfterReturning("bean(FirstService).firstMethod(..)")兩種方法

然后兩者都有效。 第一個 OR 語句有什么問題?

這個切點表達式不能按預期工作的原因是它不正確。 Spring 框架沒有拋出任何異常,這是導致混淆的另一個原因。

根據 Spring 參考文檔第5.4.3 聲明 Pointcut聲明bean()切入點指示符的正確方法如下

bean(idOrNameOfBean)

idOrNameOfBean 標記可以是任何 Spring bean 的名稱。 .

像以下代碼這樣的方面是定義方面的正確方法,這將攔截兩個 bean 的所有方法調用。

@Component
@Aspect
public class BeanAdviceAspect {

    @AfterReturning("bean(firstService) || bean(secondService)")
    public void logMethodCall(JoinPoint jp) {
        System.out.println(jp.getSignature());
    }
}

切入點表達式bean(firstService).firstMethod()不正確,框架似乎丟棄了bean(firstService)之后的任何內容,這就是當聲明被反轉時您的測試用例表現不同的原因。

為了確認這種行為,以下方面

@Component
@Aspect
public class BeanAdviceAspect {

    @AfterReturning("bean(firstService).firstMethod() || bean(secondService)")
    public void logMethodCall(JoinPoint jp) {
        System.out.println(jp.getSignature());
    }
}

由於上述原因,還會建議使用firstService.thirdMethod()方法。

聲明bean切入點指示符的另一種方法如下。 這匹配任何與通配符表達式匹配的 Spring bean 名稱中的方法執行。

@AfterReturning("bean(*Service)")
public void logMethodCall(JoinPoint jp) {
    System.out.println(jp.getSignature());
}

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM