首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个Spring切入点没有触发?

为什么这个Spring切入点没有触发?
EN

Stack Overflow用户
提问于 2012-02-10 05:48:15
回答 1查看 3.8K关注 0票数 6

我正在编写非常基本的基于模式的Spring,下面是.xml

代码语言:javascript
复制
<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()方法。

代码语言:javascript
复制
public void log(){
    callme();
    System.out.println("Hello from logger ~~~~~~~~~~~~~~~~~~~");
}

public void callme(){
    System.out.println("I'm called");
}

注意,callme()是由log()调用的。

现在我有了一个调度程序,它每5秒调用log()一次:

代码语言:javascript
复制
<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():

代码语言:javascript
复制
<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()!

有什么建议吗?在我看来,这个切入点与另一个方法中调用的方法不匹配.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-10 06:36:05

Spring只在调用通过bean句柄执行时(因为拦截器是通过使用代理对象应用)而不是在直接调用方法时捕获方法调用。

要使代码正常工作,您需要切换到使用AspectJ (它通过重写类的字节码来工作,这允许它拦截更多的东西并以更透明的方式完成),或者更改调用callme()的方式,以便通过bean句柄:

代码语言:javascript
复制
SomeClass selfRef;

public void log(){
    selfRef.callme();
    System.out.println("Hello from logger ~~~~~~~~~~~~~~~~~~~");
}

public void callme(){
    System.out.println("I'm called");
}

您需要显式配置selfRef字段;它不会是自动配置的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9223310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档