1

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

}

如果我从另一个类中调用此方法,则会调用建议。

为什么内部没有调用它?

4

3 回答 3

3

您需要在此处阅读有关代理的文档。

基本上,由于代理的生成方式,另一个实例方法中的实例方法调用不会触发方面(或代理行为)。

鉴于:

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

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

假设一个实例FooBar被代理,调用foo()将触发方面,因为从外部你有一个对代理对象的引用。当您在bar()内部调用时,您可以访问this(等效于this.bar()),它是对目标实例(实际对象)的引用,因此没有添加行为。

有几种方法可以解决此问题,但可能不是您想要的方式。请参阅此问题的答案。

于 2013-06-03T13:29:20.523 回答
0

AOP 通常不会以这种方式工作。

AOP 作为一个方面通过代理添加到编译的类中,因此它对内部类调用没有任何影响。

  1. 当它是一个外部 cal 时,您实际上指的是一些代理,它拦截您的调用并触发适当的 AOP 调用。
  2. 当是内部调用时,在类内部,是直接调用,不涉及任何代理。

作为解决方案,您可以执行以下操作:

  1. 您正在使用的重构服务,以排除内部调用
  2. 使用您的 AOP 功能更改类加载的字节码 :)
于 2013-06-03T13:30:10.003 回答
0

如果您希望在从方法 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

于 2013-06-07T13:22:38.550 回答