记录 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应用程序停止运行时。