我的建议是不要从该方法调用方法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){
...
}
如果我从另一个类中调用这个方法,那么advice就会被调用。
为什么没有内部调用?
3条答案
按热度按时间3qpi33ja1#
您需要阅读有关代理的文档。
基本上,由于代理的生成方式,另一个示例方法中的示例方法调用不会触发方面(或代理行为)。
给定:
假设
FooBar
的一个示例被代理了,调用foo()
将触发方面,因为从外部你有一个对代理对象的引用。当你在内部调用bar()
时,你可以访问this
(等价于this.bar()
),它是一个对目标示例的引用,实际的对象,所以没有增加行为。有几种方法可以解决这个问题,但可能不是你想要的方法。请参阅this问题的答案。
r6vfmomb2#
AOP通常不会以这种方式工作。
AOP是作为一个方面通过代理添加到编译的类中的,因此它对内部类调用没有任何影响。
1.当它是一个外部调用时,你实际上是在引用某个代理,它会拦截你的调用并触发适当的AOP调用。
1.当它是类内部的内部调用时,它是一个直接调用,不涉及任何代理。
作为解决方案,您可以执行以下操作:
1.正在使用的Refactore服务,以排除内部调用
1.使用AOP功能在类加载时更改字节码:)
yfwxisqw3#
如果您希望在从方法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