我正在编写非常基本的基于模式的Spring,下面是.xml
<bean id="aoplistener" class="tao.zhang.Listener"/>
<aop:config>
<aop:aspect ref="aoplistener">
<aop:pointcut id="whenCalled" expression="execution(* callme(..))" />
<aop:after method="scream" pointcut-ref="whenCalled" />
</aop:aspect>
</aop:config>tao.zhang.Listener ()tao.zhang.Listener中的方法tao.zhang.Listener只打印出一些文本,并且应该在方法callme()被调用时执行。
我有一个名为logger的bean,它具有log()和callme()方法。
public void log(){
callme();
System.out.println("Hello from logger ~~~~~~~~~~~~~~~~~~~");
}
public void callme(){
System.out.println("I'm called");
}注意,callme()是由log()调用的。
现在我有了一个调度程序,它每5秒调用log()一次:
<task:scheduler id="myScheduler" pool-size="10"/>
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="logger" method="log" fixed-rate="5000"/>
</task:scheduled-tasks>奇怪的是,没有调用 called (),但是如果直接调用了callme():
<task:scheduler id="myScheduler" pool-size="10"/>
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="logger" method="callme" fixed-rate="5000"/>
</task:scheduled-tasks>调用scream()!
有什么建议吗?在我看来,这个切入点与另一个方法中调用的方法不匹配.
发布于 2012-02-10 06:36:05
Spring只在调用通过bean句柄执行时(因为拦截器是通过使用代理对象应用)而不是在直接调用方法时捕获方法调用。
要使代码正常工作,您需要切换到使用AspectJ (它通过重写类的字节码来工作,这允许它拦截更多的东西并以更透明的方式完成),或者更改调用callme()的方式,以便通过bean句柄:
SomeClass selfRef;
public void log(){
selfRef.callme();
System.out.println("Hello from logger ~~~~~~~~~~~~~~~~~~~");
}
public void callme(){
System.out.println("I'm called");
}您需要显式配置selfRef字段;它不会是自动配置的。
https://stackoverflow.com/questions/9223310
复制相似问题