java Spring AOP建议没有被调用
我的建议不是从这个方法中调用方法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){
...
}
如果我从另一个类调用此方法,则会调用建议
为什么没有内部呼叫
# 1 楼答案
如果您希望在从方法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
# 2 楼答案
你需要阅读关于proxies here的文档
基本上,由于代理的生成方式,另一个实例方法中的实例方法调用不会触发方面(或代理行为)
鉴于:
假设
FooBar
的一个实例被代理,对foo()
的调用将触发aspect,因为从外部可以引用代理对象。在内部调用bar()
时,可以访问this
(相当于this.bar()
),它是对目标实例(实际对象)的引用,因此没有添加行为有几种方法可以解决这个问题,但可能不是你想要的方式。参见this问题的答案