目录
一、SpringApplicationRunListener生命周期方法
一、SpringApplicationRunListener生命周期方法
Spring Boot定义的SpringApplicationRunListener实现类只有EventPublishingRunListener,主要是定义了其生命周期,并且在Spring Boot启动过程中完成回调。如果自定义实现的话,则需要使用自动装配的方式将自己添加到
META-INF/spring.factories中才能被执行回调。先看看定义的接口:
public interface SpringApplicationRunListener {
// run方法开始执行时
default void starting() {
}
// Environment准备好之后
default void environmentPrepared(ConfigurableEnvironment environment) {
}
// ApplicationContext准备好之后
default void contextPrepared(ConfigurableApplicationContext context) {
}
// ApplicationContext加载完成
default void contextLoaded(ConfigurableApplicationContext context) {
}
// run方法启动完成,回调ApplicationRunner和CommandLineRunner之前
default void started(ConfigurableApplicationContext context) {
}
// run方法执行完成,马上出方法栈时
default void running(ConfigurableApplicationContext context) {
}
// 运行异常时,执行的逻辑
default void failed(ConfigurableApplicationContext context, Throwable exception) {
}
}
1、starting
在一切准备就绪,准备启动时。
2、environmentPrepared
在prepareEnvironment方法内部调用。
3、contextPrepared
在prepareContext的开始阶段被调用。
4、contextLoaded
在prepareContext的最后一步被调用。
5、started
在所有执行完成,ApplicationRunner和CommandLineRunner回调之前。
6、running
在run方法最后单独使用try catch执行,只要上面没有异常,项目已经启动完成。那么running回调异常也不能影响正常流程。
7、failed
在handleRunFailure异常处理中被调用。
二、EventPublishingRunListener
在Spring Boot中实现了SpringApplicationRunListener接口的只有EventPublishingRunListener。其属性和构造如下:
public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered {
// Spring上下文
private final SpringApplication application;
// main方法启动的参数
private final String[] args;
// 事件发送器
private final SimpleApplicationEventMulticaster initialMulticaster;
public EventPublishingRunListener(SpringApplication application, String[] args) {
this.application = application;
this.args = args;
this.initialMulticaster = new SimpleApplicationEventMulticaster();
for (ApplicationListener<?> listener : application.getListeners()) {
this.initialMulticaster.addApplicationListener(listener);
}
}
// 其余省略
}
在构造函数中赋值了ApplicationContext和args,并且创建了SimpleApplicationEventMulticaster事件发送器。在SpringApplicationContext的refresh时会创建SimpleApplicationEventMulticaster,但是现在还未执行refresh,则需要提前创建该对象。详细可以参见:Spring源码-事件监听机制(实现EventListener接口)或者Spring源码-事件监听机制(@EventListener实现方式)。而对应SpringApplicationRunListener每个生命周期,则只是发送某一种特定的事件,如starting
@Override
public void starting() {
this.initialMulticaster.multicastEvent(new ApplicationStartingEvent(this.application, this.args));
}
SpringApplicationRunListener生命周期和对应事件发送类型为:
starting | |
| |
| |
| |
| |
| |
| |
三、总结
在知道了SpringApplicationRunListener的回调方法和时机后,那么我们可以在项目中添加自己的业务逻辑和扩展。主要有两种方式:
1)、自己写一个SpringApplicationRunListener实现类。只是需要实现7个接口,估计很多都是空方法。
2)、按照执行时机,自己实现不同类型的事件监听(如 implements ApplicationListener<ApplicationStartingEvent>)。
只是需要注意,如果想实现多个相同时机的事件时,如果想按照顺序执行。实现SpringApplicationRunListener方式可以按照@Order进行排序, 而我们知道Spring的事件发送机制是无序的。