如何为同一类中的另一个方法调用的方法运行方面建议

时间:2012-01-06 09:36:38

标签: multithreading spring proxy aop pointcut

我对Spring AOP有一个麻烦。我试图使用方面触发一个方法,但是触发方面的方法也是同一个类的方法,方面不起作用(顺便说一句都没有错误)。就像这个

class A extends Runnable{
  public void write(){
      System.out.println('Hi');
  }

   public void run(){
       this.write();
   }

}

<aop:after-returning  method="anyMethod" pointcut="execution(* A.write(..))"/>

任何想法都将受到赞赏

由于

3 个答案:

答案 0 :(得分:1)

在不同的线程中调用建议方法的事实没有任何区别。只需确保传递给线程的实例是由spring应用程序上下文创建的,而不是由应用程序代码创建的。

此外,由于您建议在类中声明的方法,而不是接口 - write() - 您需要执行加载时编织(并在类路径中使用cglib)。

答案 1 :(得分:0)

这是因为Spring AOP是基于代理的。您使用代理委派对底层对象的调用。但是,当底层对象的方法调用其中的另一个方法(同一个类(您的用例))时,代理不会进入图片,因此您尝试实现的方法是不可能的。有一些工作,但它们杀死了AOP的目的。

您可以在此处参考更多信息。

http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/html/aop.html#aop-understanding-aop-proxies

答案 2 :(得分:0)

正如 Abhishek Chauhan 所说,Spring AOP是基于代理的,因此无法拦截对this.someMethod()的直接调用。但好消息是,您还可以通过Spring manual中所述的加载时编织在Spring应用程序中使用完整的AspectJ。这样你就可以摆脱限制甚至整个代理开销,因为AspectJ不需要任何代理。