SpringApplication:应用事件和监听器

本文介绍了SpringBoot3.2.0中除常规事件外的应用事件,如ApplicationStartingEvent到ApplicationReadyEvent,以及如何在早期阶段注册监听器,包括使用SpringApplicationBuilder、spring.factories文件和避免在未初始化的上下文中使用耗时任务的提示。
摘要由CSDN通过智能技术生成

https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#features.spring-application.application-events-and-listeners

除了Spring框架的常规事件(如ContextRefreshedEvent)之外,SpringApplication还会发送一些额外的应用事件。

注意:有些事件在应用上下文(ApplicationContext)创建之前就已经被触发了。因此,你不能简单地将监听这些事件的监听器作为@Bean来注册,因为在监听器需要响应事件时,应用上下文可能还没有完全初始化,从而无法访问到这些@Bean。为了在早期阶段监听这些事件,你可以使用SpringApplication.addListeners(…)方法或SpringApplicationBuilder.listeners(…)方法来注册监听器。这些方法允许你在Spring应用启动过程中非常早的阶段就注册监听器,这样监听器就能捕获到那些在应用上下文创建之前触发的事件。
如果你希望这些监听器能够自动注册,无论应用是以何种方式创建的,你可以在你的项目中添加一个META-INF/spring.factories文件,并使用org.springframework.context.ApplicationListener键来引用你的监听器,如下例所示:

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

在这个spring.factories文件中,你可以为org.springframework.context.ApplicationListener指定一个或多个监听器的全类名。当Spring Boot应用启动时,它会自动扫描这个文件,并实例化其中列出的所有监听器,然后将它们添加到应用上下文中。
这种方式的好处是,你不需要在应用代码中显式地添加监听器,无论你是使用SpringApplication.run()方法还是通过其它方式创建应用上下文,监听器都会被自动注册。

当你的应用程序运行时,应用事件将按照以下顺序发送:

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

上述列表仅包括与SpringApplication绑定的SpringApplicationEvent。除此之外,在ApplicationPreparedEvent之后和ApplicationStartedEvent之前还会发布以下事件:

  • WebServer准备就绪后,会发送WebServerInitializedEventServletWebServerInitializedEventReactiveWebServerInitializedEvent分别是其Servlet和Reactive的变体。
  • ApplicationContext被刷新时,会发送ContextRefreshedEvent

提示:你通常不需要使用应用程序事件,但知道它们的存在会很有用。在内部,Spring Boot使用事件来处理各种任务。

注意:事件监听器默认是在处理事件的同一线程中执行的,因此不应运行可能耗时的任务。相反,而是将这些任务放在应用程序运行器(Application Runner)或命令行运行器(Command-line Runner)中执行。

应用程序事件是通过使用Spring框架的事件发布机制来发送的。该机制的一部分确保发布给子上下文中的监听器的事件也会发布给任何祖先上下文中的监听器。因此,如果你的应用程序使用了多个层次的SpringApplication实例,那么监听器可能会接收到多个相同类型的应用程序事件实例。
为了让你的监听器能够区分来自其自身上下文的事件和来自后代上下文的事件,它应该请求注入其应用上下文,然后将注入的上下文与事件的上下文进行比较。上下文可以通过实现ApplicationContextAware接口来注入,或者,如果监听器是一个bean,也可以使用@Autowired注解来注入。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值