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
事件.
- 上下文开始使用环境但未创建上下文时,发送
ApplicationEnvironmentPreparedEvent
事件. - Bean实例定义被加载但未刷新时发送
ApplicationPreparedEvent
事件. - 上下文刷新后但未调用调用任何应用程序和命令行执行器时发送
ApplicationStartedEvent
事件. - 任何应用程序和命令行执行器被调用执行后发送
ApplicationReadyEvent
事件.它表明应用已准备好处理请求. - 启动时抛出异常时发送
ApplicationFailedEvent
事件.
Tip
您通常不需要使用应用程序事件,但是知道它们的存在是很方便的.在内部,Spring Boot使用事件来处理各种任务.
应用程序事件通过使用Spring框架的事件发布机制发送.这种机制的一部分,确保事件发布到子上下文监听器也会被发布到任何父上下文侦听器.
因此,如果您的应用程序使用了层次关系SpringApplication
实例,一个侦听器可能会收到多个相同的应用程序事件实例.
为了允许你的侦听器区分来自自身上下文和继承上下文的事件,它应该请求应用程序注入它自己的上下文,然后比较注入的上下文与的背事件的上下文.
上下文可以通过实现ApplicationContextAware
接口的方式注入或者如果侦听器是一个Bean实例,可通过使用@autowired
方式注入.