23.5 Application Events and Listeners

除了通常的Spring Framework的事件,如ContextRefreshedEvent ,SpringApplication还发送一些额外的应用程序事件.

Note

有些事项在ApplicatonContext创建前就会被触发,所以你不能注册响应的监听器为Spring实例.你可以通过SpringApplication.addListeners(...)方法或者SpringApplicationBuilder.listeners(...)方法来注册他们.

如果你想要自动注册这些侦听器,不管创建应用程序的方式,您可以在您的项目添加一个META-INF/spring.factory文件并通过键org.springframework.context.ApplicationListener引用你的监听器,如以下示例所示: org.springframework.context.ApplicationListener=com.example.project.MyListener 到和参考你的侦听器使用

当你的应用启动时,应用程序事件按照以下顺序发送: 1.程序启动并完成监听的初始化和注册后,发送ApplicationStartingEvent事件.

  1. 上下文开始使用环境但未创建上下文时,发送ApplicationEnvironmentPreparedEvent事件.
  2. Bean实例定义被加载但未刷新时发送ApplicationPreparedEvent事件.
  3. 上下文刷新后但未调用调用任何应用程序和命令行执行器时发送ApplicationStartedEvent事件.
  4. 任何应用程序和命令行执行器被调用执行后发送ApplicationReadyEvent事件.它表明应用已准备好处理请求.
  5. 启动时抛出异常时发送ApplicationFailedEvent事件.

Tip

您通常不需要使用应用程序事件,但是知道它们的存在是很方便的.在内部,Spring Boot使用事件来处理各种任务.

应用程序事件通过使用Spring框架的事件发布机制发送.这种机制的一部分,确保事件发布到子上下文监听器也会被发布到任何父上下文侦听器. 因此,如果您的应用程序使用了层次关系SpringApplication实例,一个侦听器可能会收到多个相同的应用程序事件实例.

为了允许你的侦听器区分来自自身上下文和继承上下文的事件,它应该请求应用程序注入它自己的上下文,然后比较注入的上下文与的背事件的上下文. 上下文可以通过实现ApplicationContextAware接口的方式注入或者如果侦听器是一个Bean实例,可通过使用@autowired方式注入.