我对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(..))"/>
任何想法都将受到赞赏
由于
答案 0 :(得分:1)
在不同的线程中调用建议方法的事实没有任何区别。只需确保传递给线程的实例是由spring应用程序上下文创建的,而不是由应用程序代码创建的。
此外,由于您建议在类中声明的方法,而不是接口 - write()
- 您需要执行加载时编织(并在类路径中使用cglib)。
答案 1 :(得分:0)
这是因为Spring AOP是基于代理的。您使用代理委派对底层对象的调用。但是,当底层对象的方法调用其中的另一个方法(同一个类(您的用例))时,代理不会进入图片,因此您尝试实现的方法是不可能的。有一些工作,但它们杀死了AOP的目的。
您可以在此处参考更多信息。
答案 2 :(得分:0)
正如 Abhishek Chauhan 所说,Spring AOP是基于代理的,因此无法拦截对this.someMethod()
的直接调用。但好消息是,您还可以通过Spring manual中所述的加载时编织在Spring应用程序中使用完整的AspectJ。这样你就可以摆脱限制甚至整个代理开销,因为AspectJ不需要任何代理。