java Spring AOP建议没有被调用

but5z9lq  于 2023-02-18  发布在  Java
关注(0)|答案(3)|浏览(118)

我的建议是不要从该方法调用方法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){
    ...

}

如果我从另一个类中调用这个方法,那么advice就会被调用。
为什么没有内部调用?

3qpi33ja

3qpi33ja1#

您需要阅读有关代理的文档。
基本上,由于代理的生成方式,另一个示例方法中的示例方法调用不会触发方面(或代理行为)。
给定:

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

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

假设FooBar的一个示例被代理了,调用foo()将触发方面,因为从外部你有一个对代理对象的引用。当你在内部调用bar()时,你可以访问this(等价于this.bar()),它是一个对目标示例的引用,实际的对象,所以没有增加行为。
有几种方法可以解决这个问题,但可能不是你想要的方法。请参阅this问题的答案。

r6vfmomb

r6vfmomb2#

AOP通常不会以这种方式工作。
AOP是作为一个方面通过代理添加到编译的类中的,因此它对内部类调用没有任何影响。
1.当它是一个外部调用时,你实际上是在引用某个代理,它会拦截你的调用并触发适当的AOP调用。
1.当它是类内部的内部调用时,它是一个直接调用,不涉及任何代理。
作为解决方案,您可以执行以下操作:
1.正在使用的Refactore服务,以排除内部调用
1.使用AOP功能在类加载时更改字节码:)

yfwxisqw

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

相关问题