我正在尝试使用像这样的自定义应用程序监听器来创建上下文
@Component
public class ContextStartedListener implements ApplicationListener<ContextStartedEvent> {
@Override
public void onApplicationEvent(ContextStartedEvent event) {
System.out.println("Context started"); // this never happens
}
}
但onApplicationEvent
方法永远不会触发。如果我使用其他事件,例如ContextRefreshedEvent
,那么它可以正常工作,但我需要在创建之前挂钩。有什么建议?谢谢!
答案 0 :(得分:4)
<强> [编辑] 强>
编辑答案因为downvote而添加更多信息。
您没有收到侦听器回调的原因是您没有明确调用 LifeCycle start()
方法(JavaDoc)。
通常通过 ConfigurableApplicationContext 在Spring Boot案例中通过 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
:
[..]这允许在上下文刷新时通知MyListener 并且可以使用它在应用程序时运行任意代码 语境已经完全开始。[..]