SpringApplicationRunListener
SpringApplicationRunListener是一个只有SpringBoot应用的
main方法执行过程中接收不同执行时点事件通知的监听者
:
public interface SpringApplicationRunListener {
void started();
void environmentPrepared(ConfigurableEnvironment environment);
void contextPrepared(ConfigurableApplicationContext context);
void contextLoaded(ConfigurableApplicationContext context);
void finished(ConfigurableApplicationContext context, Throwable exception);
}
对于我们来说,基本没什么常见的场景需要自己实现
一个SpringApplicationRunListener,即使SpringBoot默认也只是实现了一个org.spring-framework.boot.context.event.EventPublishingRunListener
,用于在SpringBoot启动的不同时点发布不同的应用事件类型(ApplicationEvent)
,如果有哪些ApplicationListener对这些应用事件感兴趣,则可以接收并处理。(还记得SpringApplication实例初始化的时候加载了一批ApplicationListener,但是在run方法执行流程中却没有被使用的丝毫痕迹吗?EventPublishingRunListener就是答案!)
假设我们真的有场景需要自定义一个SpringApplicationRunListener实现,那么有一点需要注意,即任何一个SpringApplicationRunListener实现类的构造方法(Constructor)需要有两个构造参数,一个构造参数的类型就是我们的org.springframework.boot.SpringApplication,另外一个就是args参数列表的String[]:
public class DemoSpringApplicationRunListener implements SpringApplicationRunListener {
@Override
public void started() {
// do whatever you want to do
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
// do whatever you want to do
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
// do whatever you want to do
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
// do whatever you want to do
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
// do whatever you want to do
}
}
之后,我们可以通过SpringFactoriesLoader立下的规矩,在当前SpringBoot应用的classpath下的META-INF/spring.factories文件中进行类似如下的配置:
org.springframework.boot.SpringApplicationRunListener=\
com.keevol.springboot.demo.DemoSpringApplicationRunListener
然后SpringApplication就会在运行的时候调用它啦!