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