[英]Spring AOP advice is not getting called
我的建議是不要從這個方法調用方法getPOInvoice方法,但是如果我單獨調用它,那么調用的是調用,並且getPOInvoice和getPOInvoice在同一個類中聲明。
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添加到已編譯的類中,因此它對內部類調用沒有任何影響。
作為解決方案,您可以執行以下操作
如果你想要從getPDFStream(..)方法調用時調用getPOInvoice方法,在同一個bean中,你不能使用基於代理的AOP,比如默認使用Spring。 相反,您應該使用AspectJ加載時間編織(LTW)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.