簡體   English   中英

Spring AOP建議沒有被調用

[英]Spring AOP advice is not getting called

我的建議是不要從這個方法調用方法getPOInvoice方法,但是如果我單獨調用它,那么調用的是調用,並且getPOInvoicegetPOInvoice在同一個類中聲明。

public StreamingOutput getPDFStream(String invoiceId, String versionNumber) throws TugnavException {

   final POInvoice poInv =  getPOInvoice(invoiceId, versionNumber);
   ...
}

我的建議是:

@AfterReturning(value="execution(* com.tugnav.service.facade.*.get*(..))", returning="doc")
    public TugnavBaseDocument setupTimeCreatedString(TugnavBaseDocument doc){
    ...

}

如果我從另一個類調用此方法,則會調用通知。

為什么不在內部調用?

您需要在此處閱讀有關代理的文檔。

基本上,由於生成代理的方式,另一個實例方法中的實例方法調用不會觸發方面(或代理行為)。

鑒於:

class FooBar {
    // advised method
    public void foo() {
        bar();
    }

    // would've been advised
    public void bar() {
        // ... do something
    }
}

假設FooBar一個實例被代理,對foo()的調用將觸發方面,因為從外部你有一個對代理對象的引用。 當你在內部調用bar() ,你可以訪問this (相當於this.bar() ),它是對目標實例(實際對象)的引用,因此沒有添加行為。

有幾種方法可以解決這個問題,但可能不是你想要的方式。 看到這個問題的答案。

AOP通常不會這樣工作。

AOP作為一個方面通過Proxies添加到已編譯的類中,因此它對內部類調用沒有任何影響。

  1. 當它是外部校准時,你實際上指的是某個代理攔截你的呼叫並觸發適當的AOP呼叫。
  2. 當它是內部校准時,在課堂內,它是直接調用,不涉及任何代理。

作為解決方案,您可以執行以下操作

  1. 您正在使用的重構服務,以排除內部調用
  2. 使用AOP功能改變類加載時的字節碼:)

如果你想要從getPDFStream(..)方法調用時調用getPOInvoice方法,在同一個bean中,你不能使用基於代理的AOP,比如默認使用Spring。 相反,您應該使用AspectJ加載時間編織(LTW)。

http://static.springsource.org/spring/docs/3.2.2.RELEASE/spring-framework-reference/html/aop.html#aop-aj-ltw

暫無
暫無

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

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