一,启动过程中的一些事件
在spring容器初始化前,会通过SpringApplicationRunListener触发ApplicationStartedEvent事件,在容器实例化完成后触发ApplicationReadyEvent事件。
SpringApplication 通过SpringFactoriesLoader从META-INF/spring.factories资源中加载其实现类EventPublishingRunListener。
启动事件(按先后顺序)
ApplicationStartingEvent
这个事件在 Spring Boot 应用运行开始时,且进行任何处理之前发送(除了监听器和初始化器注册之外)。
ApplicationEnvironmentPreparedEvent
这个事件在当已知要在上下文中使用 Spring 环境(Environment)时,在 Spring 上下文(context)创建之前发送。
ApplicationContextInitializedEvent
这个事件在当 Spring 应用上下文(ApplicationContext)准备好了,并且应用初始化器(ApplicationContextInitializers)已经被调用,在 bean 的定义(bean definitions)被加载之前发送。
ApplicationPreparedEvent
这个事件是在 Spring 上下文(context)刷新之前,且在 bean 的定义(bean definitions)被加载之后发送。
ApplicationStartedEvent
这个事件是在 Spring 上下文(context)刷新之后,且在 application/ command-line runners 被调用之前发送。
AvailabilityChangeEvent
这个事件紧随上个事件之后发送,状态:ReadinessState.CORRECT,表示应用已处于活动状态。
ApplicationReadyEvent
这个事件在任何 application/ command-line runners 调用之后发送。
AvailabilityChangeEvent
这个事件紧随上个事件之后发送,状态:ReadinessState.ACCEPTING_TRAFFIC,表示应用可以开始准备接收请求了。
ApplicationFailedEvent
这个事件在应用启动异常时进行发送。
上面所介绍的这些事件列表仅包括绑定到 SpringApplication 的 SpringApplicationEvents 事件,除了这些事件以外,以下事件也会在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前发送
WebServerInitializedEvent
这个 Web 服务器初始化事件在 WebServer 启动之后发送,对应的还有
ServletWebServerInitializedEvent
Servlet Web 服务器初始化事件
ReactiveWebServerInitializedEvent
响应式 Web 服务器初始化事件
ContextRefreshedEvent
这个上下文刷新事件是在 Spring 应用上下文(ApplicationContext)刷新之后发送。
ClearCachesApplicationListener
用于在 application context 应用程序上下文加载之后清除启动过程中所使用的缓存,
关注的事件是 ContextRefreshedEvent ,也就是说在该事件发生时相应的缓存清除动作会发生。
会清除哪些缓存呢 ?
- ReflectionUtils所使用的缓存;
- 所对应classLoader及其祖先classLoader所使用的缓存;
二,请求过程中的事件
ServletRequestHandledEvent
请求结束回调事件
三,其他
ParentContextCloserApplicationListener
在一个应用上下文的双亲应用上下文关闭时关闭该应用上下文。这个监听器监听应用上下文刷新事件并从中取出应用上下文,然后监听关闭事件在应用上下文的层级结构中往下层传播该事件。
ParentContextAvailableEvent
监听ParentContextAvailableEvent事件,当前的应用上线文有parent context时,向parent context中注册ContextCloserListener,当parent context关闭时通知子容器
FileEncodingApplicationListener
检测当前系统环境的file.encoding和spring.mandatory-file-encoding设置的值是否一样 ,不一样则抛出IllegalStateException异常
AnsiOutputApplicationListener
监听ApplicationEnvironmentPreparedEvent事件,获取
Environment 中的spring.output.ansi.enabled, 设置彩色输出会让日志更具可读性
ConfigFileApplicationListener
监听ApplicationEnvironmentPreparedEvent和ApplicationPreparedEvent事件,且ConfigFileApplicationListener也实现了EnvironmentPostProcessor接口,ApplicationEnvironmentPreparedEvent事件会加载外部化配置文件,如 application.yaml和application.perprotiess
ApplicationEnvironmentPreparedEvent
通过SpringFactoriesLoader.loadFactories加载EnvironmentPostProcessor
DelegatingApplicationListener
注册在environment中的配置的context.listener.classes监听器
ClasspathLoggingApplicationListener
日志级别为debug级别时,在环境准备完成事件ApplicationEnvironmentPreparedEvent或者应用失败事件ApplicationFailedEvent 发生时,输出线程上下文类加载器的classpath
LoggingApplicationListener
识别日志框架,并加载日志配置文件
LiquibaseServiceLocatorApplicationListener
监听ApplicationStartingEvent事件,取代liquibase ServiceLocator
BackgroundPreinitializer
监听ApplicationReadyEvent和ApplicationFailedEvent事件,异步线程触发早期的初始化操作
EventPublishingRunListener
在实例化EventPublishingRunListener的过程中,会给它最重要的属性initialMulticaster赋值,其类型是SimpleApplicationEventMulticaster。接着遍历 SpringApplication 初始化阶段的listeners监听器集合,将监听器存入其关联的ListenerRetriever#applicationListeners属性中
四,项目中使用这些事件