Skip to content

记录 spring 框架中的一些事件发送时机以及简单使用。

主要对象

  • ApplicationEventPublisher
    • 发送事件的顶级接口
  • ApplicationListener
    • 监听事件的顶级接口
    • 继承java.util.EventListener
  • ApplicationEvent
    • 顶级事件对象,在特定的时机会发生不同的事件。
  • @EventListener
    • 通过注解方式创建ApplicationListener
    • @TransactionalEventListener

@EventListener实现方式

简单说就是通过 BeanFactoryPostProcessor 添加 EventListenerFactory,然后在spring所有单例非延迟加载的 Bean 都实例化完后

通过SmartInitializingSingleton#afterSingletonsInstantiated找到所有有@EventListener的方法,创建监听器并添加到容器中。


@TransactionalEventListener 实现

整体流程和@EventListener一致,只是使用TransactionalEventListenerFactory来创建TransactionalApplicationListenerMethodAdapter

在处理事件时,会通过TransactionSynchronizationManager注册TransactionalApplicationListenerSynchronization。在特定情况下执行注解所在的方法。


常见事件

  • ContextRefreshedEvent: 当ApplicationContext被初始化或刷新时发送,即当应用程序上下文被完全初始化并可以使用时。

  • ContextStartedEvent: 当ApplicationContext被启动时发送,即当应用程序上下文开始执行时。

  • ContextStoppedEvent: 当ApplicationContext被停止时发送,即当应用程序上下文停止执行时。

  • ContextClosedEvent: 当ApplicationContext被关闭时发送,即当应用程序上下文被销毁时。

  • RequestHandledEvent: 当HTTP请求被处理完毕后发送,即当HTTP请求处理完成并响应发送回客户端时。

  • ApplicationStartedEvent: 当Spring Boot应用程序启动时发送,即当Spring Boot启动并准备好接受请求时。

  • ApplicationReadyEvent: 当Spring Boot应用程序准备好接受请求时发送,即当Spring Boot启动并应用程序上下文已准备好接受请求时。

  • ApplicationStoppedEvent: 当Spring Boot应用程序停止时发送,即当Spring Boot应用程序停止运行时。