Spring ApplicationListener没有收到事件

我有以下ApplicationListener:

package org.mycompany.listeners; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextStartedEvent; public class MyApplicationListener implements ApplicationListener<ContextStartedEvent> { public MyApplicationListener() { super(); System.out.println("Application context listener is created!"); } /** * {@inheritDoc} */ public void onApplicationEvent(final ContextStartedEvent event) { System.out.println("Context '" + event.getApplicationContext().getDisplayName() + "' is started!"); } } 

和下面的bean定义一样:

 <bean name="myApplicationListener" class="org.mycompany.listeners.MyApplicationListener" /> 

我可以看到,bean是从构造函数打印的消息创build的,但是上下文启动事件从来没有收到。 我错过了什么?

在上下文中显式调用ConfigurableApplicationContext.start()时,会发布ContextStartedEvent 。 如果需要在上下文初始化时发布的事件,请使用ContextRefreshedEvent

也可以看看:

  • 3.13.2标准和自定义事件

既然你没有懒加载的bean(根据你),那么你很可能使用事件的原因是错误的,可能应该使用像InitializingBean接口,而不是:

 public class MyBean implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { // ... } } 

从春季手册:

为了与bean生命周期的容器pipe理交互,可以实现Spring InitializingBean和DisposableBean接口。 容器为前者调用afterPropertiesSet(),后者调用destroy()来允许bean在初始化和销毁​​bean时执行某些操作。 通过使用init-method和destroy方法对象定义元数据,您也可以实现与容器的相同集成,而不需要将类耦合到Spring接口。

来源: Spring框架 – 生命周期callback

不知道这是否有帮助,但我依稀记得有一个类似的问题,这是通过预加载,而不是延迟加载解决。 以下是两者的简要概述