SpringApplicationRunnerListener
在 SpringBoot 初始化化的过程中,通过回调 SpringApplicationRunnerListener 接口中的方法,来支持自定义化,它拥有如下几个回调方法:
/**
* 在容器启动正准备启动时回调,此时还为初始化 Enviroment 、以及 ApplicationContext
*/
void starting();
/**
* 在 ConfigurableEnvironment 刚创建,而 ApplicationContext 未创建时回调
*/
void environmentPrepared(ConfigurableEnvironment environment);
/**
* 当还未加载 SpringApplication 的时候回调
*/
void contextPrepared(ConfigurableApplicationContext context);
/**
* .加载了 SpringApplication 未 调用refresh() 方法时回调
*/
void contextLoaded(ConfigurableApplicationContext context);
/**
* SpringApplication 加载马上结束时回调
*/
void finished(ConfigurableApplicationContext context, Throwable exception);
使用方式:
- 新建类 EventPublishingRunListenerXxx 继承 SpringApplicationRunListener接口
- 在类路径下 META-INF/spring.factories 文件中配置:
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListenerXxx
ApplicationContextInitializer
在 ConfigurableApplicationContext 的 refresh() 方法之前进行回调(源码:SpringApplication 348行)。 applyInitializers 方法将会调用 ApplicationContext 中所有持有的 ApplicationContextInitializer 实现类的 initialize 方法
private void prepareContext(ConfigurableApplicationContext context,
ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments, Banner printedBanner) {
context.setEnvironment(environment);
postProcessApplicationContext(context);
applyInitializers(context);
使用方式:
- 新建类 Xxxxx并且 继承 ApplicationContextInitializer
- 在类路径下 META-INF/spring.factories 文件中配置:
org.springframework.context.ApplicationContextInitializer=\
com.mic.config.common.config.RegisterPropertyConfiguration
- 或者在启动 SpringBoot 的 main 方法中,通过 SpringApplication 对象进行添加
SpringApplication boot = new SpringApplication(Xxx.class);
boot.run(args);
boot.getInitializers().add(new ApplicationContextInitializer<ConfigurableApplicationContext>() {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
}
});
ApplicationListener
Spring 通过观察者设计模式来对事件进行处理。在容器初始化的时候,将所有 Listener 统一交给 ApplicationContext 进行管理,根据内置的事件机制(如:ContextRefreshEvent、ContextStartedEvent等)在容器处于不同的阶段时,通过
ApplicationContext 管理的 ApplicationListener 进行通知
使用方式
- 在类路径下 META-INF/spring.factories 文件中配置继承了 ApplicationListener 接口的类 Xxx:
# Application Listeners
org.springframework.context.ApplicationListener=Xxx
- 通过ApplicationContext#addApplicationListener 方法添加
ApplicationContext.addApplicationListener(new StatRefreshListener(this));
- 通过将 实现了 ApplicationListener 的类注册到 Spring IOC 容器中
ApplicationRunner|CommandLineRunner
在容器初始化完成之后,将被回调
SpringApplication#callRunners
private void callRunners(ApplicationContext context, ApplicationArguments args) {
List<Object> runners = new ArrayList<Object>();
runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
AnnotationAwareOrderComparator.sort(runners);
for (Object runner : new LinkedHashSet<Object>(runners)) {
if (runner instanceof ApplicationRunner) {
callRunner((ApplicationRunner) runner, args);
}
if (runner instanceof CommandLineRunner) {
callRunner((CommandLineRunner) runner, args);
}
}
}
使用方式:
通过实现 ApplicationRunner 或 CommandLineRunner 并将其注册到容器中即可,可通过 @Order 注解来调整多个 Runner 同时执行的顺序
@Component
@Order(value = Ordered.HIGHEST_PRECEDENCE)
public class TestApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
}
}
//未完待续
网友评论