一,启动过程中的一些事件

 

在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 ,也就是说在该事件发生时相应的缓存清除动作会发生。
 会清除哪些缓存呢 ?

  1.  ReflectionUtils所使用的缓存;
  2.  所对应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属性中

四,项目中使用这些事件

spring不启动容器测试 spring容器启动完成事件_java

 

spring不启动容器测试 spring容器启动完成事件_spring boot_02

spring不启动容器测试 spring容器启动完成事件_spring boot_03