我有以下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是在打印构造函数的消息时创建的,但是从不接收上下文启动事件。我错过了什么?
答案 0 :(得分:61)
ContextStartedEvent
时,将发布 ConfigurableApplicationContext.start()
。如果您需要在初始化上下文时发布的事件,请使用ContextRefreshedEvent
。
另见:
答案 1 :(得分:7)
由于你没有延迟加载bean(根据你的话),你很可能因为错误的原因而使用事件,而且可能应该使用类似InitializingBean接口的东西:
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
// ...
}
}
来自Spring手册:
要与容器管理bean生命周期进行交互,您就可以了 可以实现Spring InitializingBean和DisposableBean 接口。容器为前者调用afterPropertiesSet() 和destroy()为后者允许bean执行某些操作 初始化和销毁bean时的操作。您可以 也可以实现与容器的相同集成而无需耦合 你的类通过使用init-method和Spring接口 销毁方法对象定义元数据。
答案 2 :(得分:0)
不确定这是否有帮助,但我依稀记得有一个类似的问题,这是通过预加载而不是延迟加载来解决的。这是两者的quick overview