2012-01-06 30 views
0

我遇到了有关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(..))"/> 

任何想法会理解

感谢

回答

1

的建议方法被调用在不同的线程没有任何区别的事实。只要确保传递给线程的实例是由Spring应用程序上下文创建的,而不是由应用程序代码创建的。另外,既然你建议在类中声明一个方法,而不是一个接口 - write() - 你需要执行加载时织入(并且在你的类路径中有cglib)。

+0

感谢您的回答。我认为,我错误地写了代码。请检查上面的新的请求。正如你可以看到新的那样,线程正在调用属于它自己的方法。这意味着,在这个操作中没有与spring context的交互,因为它称之为自己的方法。我现在该怎么做? – Neron 2012-01-06 11:33:01

+0

@ user1072848这不是谁来调用它的问题,而是它是如何实例化的。 – 2012-01-06 11:49:13

+0

那么我应该怎么做来创建它就像你说的? – Neron 2012-01-06 11:55:35

0

这是因为Spring AOP是基于代理的。您使用代理将调用委托给基础对象。然而,当一个底层对象的方法调用其中的另一个方法时,同一个类(你的用例),代理不会进入画面,因此你试图实现的是不可能的。有一些解决方法,但他们杀死了AOP的目的。

您可以在这里查看更多信息。

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

0

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

相关问题