我正在尝试使用这样的自定义应用程序监听器来创建上下文
@Component
public class ContextStartedListener implements ApplicationListener<ContextStartedEvent> {
@Override
public void onApplicationEvent(ContextStartedEvent event) {
System.out.println("Context started"); // this never happens
}
}
但是
onApplicationEvent
方法永远不会触发。如果我使用其他事件,例如ContextRefreshedEvent
,那么它可以正常工作,但是在创建它之前,我需要先进行了解。有什么建议吗?谢谢! 最佳答案
[编辑]
编辑答案由于投票不足而添加了更多信息。
之所以没有通过监听器进行回调,是因为您没有显式调用 LifeCycle start()
方法(JavaDoc)。
在Spring Boot的情况下,通常通过 ConfigurableApplicationContext 通过 AbstractApplicationContext 层叠到您的 ApplicationContext 。
下面的工作代码示例演示了回调的工作方式(只需显式调用start()方法)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.event.ContextStartedEvent;
import org.springframework.stereotype.Component;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(DemoApplication.class, args);
applicationContext.start();
}
@Component
class ContextStartedListener implements ApplicationListener<ContextStartedEvent> {
@Override
public void onApplicationEvent(ContextStartedEvent event) {
System.out.println("Context started");
}
}
}
我之所以在
ContextRefreshedEvent
回调下面建议的原因是,在后台调用了refresh()
代码。如果您深入了解
SpringApplication#run()
方法you'll eventually see it。再次这是一个使用
ContextRefreshedEvent
的工作示例:import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Component
class ContextStartedListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("Context refreshed");
}
}
}
[编辑前]
将通用类型改为
ContextRefreshedEvent
,然后它应该起作用。有关更多详细信息,请阅读this article from the Spring Blog。仅引用有关
ContextRefreshedEvent
的部分: