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 的事件侦听器 @EventListenerbase-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) 覆盖来控制发布的情况下,可以使用类似的策略。

任何改变应用程序启动时间动态的因素都可能以某种方式影响行为。