springboot启动-监听器模块
监听器模块简介
- springboot在启动过程中会调用监听器模块,将开始事件、环境准备事件、启动完成/失败、准备完成等事件发布出去,客户端可以监听各种类型的事件进行特殊处理。
工作流程
- 服务端发布消息入口:SpringApplicationRunListeners,遍历调用SpringApplicationRunListener接口列表
- 中间服务商:SpringApplicationRunListener,提供发布消息的接口方法,底层调用ApplicationEventMulticaster的广播接口发布消息
- 底层维护者:ApplicationEventMulticaster,维护客户端订阅的监听实例,可以添加、删除监听器,可以将消息广播给对应的监听器
- 客户端订阅:ApplicationListener,提供给客户端实现接口
源码分析
- 监听器模块主要分为几个核心接口:
SpringApplicationRunListeners->持有服务端SpringApplicationRunListener列表
SpringApplicationRunListener->服务端调用监听接口
ApplicationListener->提供给客户端订阅的监听接口
ApplicationEventMulticaster->事件广播接口,负责维护客户端订阅的监听接口列表 - 我们常监听的springboot事件如下(有序):
ApplicationStartingEvent
ApplicationEnvironmentPreparedEvent
ApplicationFailedEvent
ApplicationStartedEvent
ApplicationReadyEvent
SpringApplicationRunListeners
- 这是一个入口类,在SpringApplication的run方法中进行调度,下面我们看下SpringApplicationRunListeners的相关源码:
属性:SpringApplicationRunListener集合是springboot启动时从spring.factory配置文件中读取
private final List<SpringApplicationRunListener> listeners;
构造器:
SpringApplicationRunListeners(Log log,
Collection<? extends SpringApplicationRunListener> listeners) {
this.log = log;
// 外部传入SpringApplicationRunListener实例列表
this.listeners = new ArrayList<>(listeners);
}
核心方法:
public void starting() {
for (SpringApplicationRunListener listener : this.listeners) {
listener.starting();
}
}
public void environmentPrepared(ConfigurableEnvironment environment) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.environmentPrepared(environment);
}
}
public void contextPrepared(ConfigurableApplicationContext context) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.contextPrepared(context);
}
}
public void contextLoaded(ConfigurableApplicationContext context) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.contextLoaded(context);
}
}
public void started(ConfigurableApplicationContext context) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.started(context);
}
}
public void running(ConfigurableApplicationContext context) {
for (SpringApplicationRunListener listener : this.listeners) {
listener.running(context);
}
}
public void failed(ConfigurableApplicationContext context, Throwable exception) {
for (SpringApplicationRunListener listener : this.listeners) {
callFailedListener(listener, context, exception);
}
}
SpringApplicationRunListener
实现类:EventPublishingRunListener
- EventPublishingRunListener目前是SpringApplicationRunListener接口的唯一实现类,并通过spring.factory进行读取类路径配置,进行实例化
- EventPublishingRunListener内部封装了调用ApplicationEventMulticaster接口的逻辑,实现消息的发布
属性:
priva