介绍
要素
- 事件
- 监听器
- 广播器
- 触发机制
事件发生顺序
监听器注册
监听器事件触发机制
获取监听器列表
通用触发条件
SpringApplicationRunListener
从命名我们就可以知道它是一个监听者,那纵观整个启动流程我们会发现,它其实是用来在整个启动流程中接收不同执行点事件通知的监听者,SpringApplicationRunListener接口规定了SpringBoot的生命周期,在各个生命周期广播相应的事件,调用实际的ApplicationListener类。
public interface SpringApplicationRunListener {
//刚执行run方法时
void started();
//环境建立好时候
void environmentPrepared(ConfigurableEnvironment environment);
//上下文建立好的时候
void contextPrepared(ConfigurableApplicationContext context);
//上下文载入配置时候
void contextLoaded(ConfigurableApplicationContext context);
//上下文刷新完成后,run方法执行完之前
void finished(ConfigurableApplicationContext context, Throwable exception);
}
它定义了5个步骤:
- started(run方法执行的时候立马执行;对应事件的类型是ApplicationStartedEvent):通知监听器,SpringBoot开始执行
- environmentPrepared(ApplicationContext创建之前并且环境信息准备好的时候调用;对应事件的类型是ApplicationEnvironmentPreparedEvent):通知监听器,Environment准备完成
- contextPrepared(ApplicationContext创建好并且在source加载之前调用一次;没有具体的对应事件):通知监听器,ApplicationContext已经创建并初始化完成
- contextLoaded(ApplicationContext创建并加载之后并在refresh之前调用;对应事件的类型是ApplicationPreparedEvent):通知监听器,ApplicationContext已经完成IoC配置价值
- finished(run方法结束之前调用;对应事件的类型是ApplicationReadyEvent或ApplicationFailedEvent):通知监听器,SpringBoot启动完成
监听器的实现
实现ApplicationListener接口针对单一事件监听
//Order值越小越先执行
@Order(1)
public class FirstListener implements ApplicationListener<ApplicationStartedEvent> {
@Override
public void onApplicationEvent(ApplicationStartedEvent event) {
System.out.println("FirstListener is run");
}
}
实现SmartApplicationListener针对多种事件监听
@Order(4)
public class FourthListener implements SmartApplicationListener {
/**
* 自定义事件支持执行的操作
* 运行程序可以看到控制台打印了两次 FourthListener is run 因为我们这里定义了两个事件支持
* @param eventType
* @return
*/
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return ApplicationStartedEvent.class.isAssignableFrom(eventType) || ApplicationReadyEvent.class.isAssignableFrom(eventType);
}
/**
* 当事件发生时执行的操作
* @param event
*/
@Override
public void onApplicationEvent(ApplicationEvent event) {
System.out.println("FourthListener is run");
}
}
监听器的注册方式
方式一:spring.factories配置
#注册自定义的监听器
org.springframework.context.ApplicationListener=com.ecit.learn.listener.FirstListener
方式二:启动类添加
@SpringBootApplication
@MapperScan("com.ecit.learn.mapper")
public class SpringbootLearnApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(SpringbootLearnApplication.class);
//添加初始化启动器
springApplication.addInitializers(new SecondInitializer());
//添加自定义的监听器
springApplication.addListeners(new SecondListener());
springApplication.run(args);
}
}
方式三:配置文件配置
context.listener.classes=com.ecit.learn.listener.ThirdListener