有些事件实际上是在 ApplicationContext 被创建之前触发的,所以你不能以 @Bean 的形式注册一个监听器。 你可以通过 SpringApplication.addListeners(…) 方法或 SpringApplicationBuilder.listeners(…) 方法注册它们。

如果你想让这些监听器自动注册,不管应用程序是如何创建的,你可以在你的项目中添加一个 META-INF/spring.plants 文件,并通过 org.springframework.context.ApplicationListener 属性来配置你的监听器,如以下例子所示。

org.springframework.context.ApplicationListener=com.example.project.MyListener

当应用程序运行时,Application event按以下顺序发布。

  1. 一个 ApplicationStartingEvent 在运行开始时被发布,但在任何处理之前,除了注册监听器和初始化器之外。
  2. 当在上下文中使用的 Environment 已知,但在创建上下文之前,将发布 ApplicationEnvironmentPreparedEvent
  3. ApplicationContext 已准备好并且 ApplicationContextInitializers 被调用,但在任何Bean定义被加载之前,ApplicationContextInitializedEvent 被发布。
  4. 一个 ApplicationPreparedEvent 将在刷新开始前但在Bean定义加载后被发布。
  5. 在上下文被刷新之后,但在任何应用程序和命令行运行程序被调用之前,将发布一个 ApplicationStartedEvent
  6. 紧接着发布 LivenessState.CORRECT 状态的 AvailabilityChangeEvent,表明应用程序被认为是存活的。
  7. 在任何ApplicationRunner 和 CommandLineRunner被调用后,将发布一个 ApplicationReadyEvent
  8. 紧接着发布 ReadinessState.ACCEPTING_TRAFFIC 状态的 AvailabilityChangeEvent,表明应用程序已经准备好为请求提供服务。
  9. 如果启动时出现异常,将发布一个 ApplicationFailedEvent

以上列表仅包括与 SpringApplication 相关的 SpringApplicationEvent。 除此以外,以下事件也会在 ApplicationPreparedEvent 之后和 ApplicationStartedEvent 之前发布。

  • WebServer 准备好后发布 WebServerInitializedEventServletWebServerInitializedEventReactiveWebServerInitializedEvent 分别对应Servlet和reactive的实现。
  • ApplicationContext 被刷新时,将发布一个 ContextRefreshedEvent