Spring @EventListener 注释不起作用
Spring @EventListener annotation doesn't work
我想在一个 class 中处理多个事件,这是我的示例:
@Lazy(false)
@Component
public class EventListenerImpl {
@EventListener
public void handleContextRefreshedEvent(ContextRefreshedEvent event) {
LOGGER.log(event.getSource());
...
}
}
但是当我的应用程序启动时,这个方法没有被执行。
在我的 applicationContext.xml
我有:
<context:annotation-config/>
<context:component-scan base-package="..."/>
根据文档,这应该足以让 @EventListener
工作。
旧的实施方式 ApplicationListener<ContextRefreshedEvent>
工作得很好。
我正在使用 Spring 4.2.4.RELEASE.
好吧,这对我来说仍然是个谜。我敢打赌这是某种奇怪的 maven/ide 缓存问题,但无论如何这在我重新启动几次后仍然有效 :
@Lazy(false)
@Component
public class EventListenerImpl {
@EventListener
public void whatever(final ContextRefreshedEvent event) {
event.getSource();
}
}
我知道这是一个老问题,答案被采纳,但我认为它没有解决问题。我有这个完全相同的问题,并且能够通过将包含 class 的事件侦听器 @EventListener
从 base-scan
包的根移动到该包的子包来解决它。例如:
<context:component-scan base-package="com.example"/>
只需在 com.example
下创建一个子包(文件夹)并将 class 放在那里:
com -> example -> foo (place class here)
这对我有用。不知道为什么它在 base-package
根目录中找不到 @EventListener
,但无论如何,它已修复。这似乎是文档中未记录的问题。
我的发现可能解释了@moonlightcheese 观察到的情况:
如果事件在应用程序生命周期的早期发布,则不会将其发送到带注释的 @EventListener
方法。如果稍后发布,则发送到方法。
我的解决方法是确保事件不会在 ContextRefreshedEvent
之前发布。我让我的发布者 class 实现了 ApplicationListener<ContextRefreshedEvent>
,并通过 onApplicationEvent(ContextRefreshedEvent event)
覆盖发布了我的事件。在使用 onApplicationEvent(ContextRefreshedEvent event)
覆盖来控制发布的情况下,可以使用类似的策略。
任何改变应用程序启动时间动态的因素都可能以某种方式影响行为。
我想在一个 class 中处理多个事件,这是我的示例:
@Lazy(false)
@Component
public class EventListenerImpl {
@EventListener
public void handleContextRefreshedEvent(ContextRefreshedEvent event) {
LOGGER.log(event.getSource());
...
}
}
但是当我的应用程序启动时,这个方法没有被执行。
在我的 applicationContext.xml
我有:
<context:annotation-config/>
<context:component-scan base-package="..."/>
根据文档,这应该足以让 @EventListener
工作。
旧的实施方式 ApplicationListener<ContextRefreshedEvent>
工作得很好。
我正在使用 Spring 4.2.4.RELEASE.
好吧,这对我来说仍然是个谜。我敢打赌这是某种奇怪的 maven/ide 缓存问题,但无论如何这在我重新启动几次后仍然有效 :
@Lazy(false)
@Component
public class EventListenerImpl {
@EventListener
public void whatever(final ContextRefreshedEvent event) {
event.getSource();
}
}
我知道这是一个老问题,答案被采纳,但我认为它没有解决问题。我有这个完全相同的问题,并且能够通过将包含 class 的事件侦听器 @EventListener
从 base-scan
包的根移动到该包的子包来解决它。例如:
<context:component-scan base-package="com.example"/>
只需在 com.example
下创建一个子包(文件夹)并将 class 放在那里:
com -> example -> foo (place class here)
这对我有用。不知道为什么它在 base-package
根目录中找不到 @EventListener
,但无论如何,它已修复。这似乎是文档中未记录的问题。
我的发现可能解释了@moonlightcheese 观察到的情况:
如果事件在应用程序生命周期的早期发布,则不会将其发送到带注释的 @EventListener
方法。如果稍后发布,则发送到方法。
我的解决方法是确保事件不会在 ContextRefreshedEvent
之前发布。我让我的发布者 class 实现了 ApplicationListener<ContextRefreshedEvent>
,并通过 onApplicationEvent(ContextRefreshedEvent event)
覆盖发布了我的事件。在使用 onApplicationEvent(ContextRefreshedEvent event)
覆盖来控制发布的情况下,可以使用类似的策略。
任何改变应用程序启动时间动态的因素都可能以某种方式影响行为。