📒 Spring 事件监听机制核心笔记
一、什么是事件监听机制?
Spring 的事件监听机制是一套基于 发布-订阅(Observer)模式 实现的事件驱动模型,它允许 Bean 在不直接调用彼此的前提下,通过事件驱动解耦协作。
二、为什么需要事件监听机制?
现实中常见业务需求:
-
用户注册后发送欢迎邮件(注册逻辑和通知逻辑解耦)
-
订单完成后记录日志、更新库存、发MQ
-
事务提交后再发布数据更新事件
这些操作如果全部写在一个方法中将导致高耦合、低可维护性。事件监听机制的目标是:
以事件为中心,按需解耦业务流程,提升可维护性与扩展性。
三、Spring 事件监听机制的核心组成
组件 | 说明 |
---|---|
ApplicationEvent | 所有事件的父类(可以自定义) |
ApplicationListener | 事件监听器接口(监听某类事件) |
ApplicationEventPublisher | 事件发布器(可注入使用) |
@EventListener | 更简洁的监听器注解方式(Spring 4.2+) |
ApplicationContext | 容器本身实现了发布器接口,可直接发布事件 |
四、事件监听的基本流程
简单理解就是:发布事件 → Spring 容器找到匹配监听器 → 回调处理方法执行
[发布者] ---> [ApplicationEventPublisher] ---> [Dispatcher] ---> [匹配监听器] ---> onEvent()
1️⃣ 创建事件类(继承或不继承 ApplicationEvent
都可)
public class UserRegisteredEvent {
private final User user;
public UserRegisteredEvent(User user) {
this.user = user;
}
}
2️⃣ 定义监听器
-
接口方式(旧)
@Component
public class WelcomeEmailListener implements ApplicationListener<UserRegisteredEvent> {
@Override
public void onApplicationEvent(UserRegisteredEvent event) {
// 发送欢迎邮件
}
}
-
注解方式(推荐)
@Component
public class WelcomeEmailListener {
@EventListener
public void handle(UserRegisteredEvent event) {
// 发送欢迎邮件
}
}
3️⃣ 发布事件
@Autowired
private ApplicationEventPublisher publisher;
publisher.publishEvent(new UserRegisteredEvent(user));
五、事件监听器的调用时机与线程模型
场景类型 | 默认行为 |
---|---|
普通事件 | 与发布者处于同一线程(同步处理) |
异步事件 | 使用 @Async 注解实现异步监听 |
事务事件监听器 | 使用 @TransactionalEventListener ,可延迟到事务提交后触发 |
六、事务监听器机制(核心机制延伸)
使用场景:
-
避免“事务还没提交,监听器逻辑已执行”,导致脏数据或缓存穿透
-
适合:发MQ、改缓存、推送等需确保数据真实存在的后置动作
用法:
@EventListener
@TransactionalEventListener(phase = AFTER_COMMIT)
public void handleAfterCommit(UserRegisteredEvent event) {
// 事务提交后再执行,如发MQ或刷新缓存
}
phase 类型 | 含义 |
---|---|
BEFORE_COMMIT | 事务提交前 |
AFTER_COMMIT | 事务提交成功后(默认) |
AFTER_ROLLBACK | 事务回滚后 |
AFTER_COMPLETION | 无论提交还是回滚都会触发 |
七、底层核心机制(简要概览)
-
事件注册机制:所有
ApplicationListener
会被收集进容器内部监听器列表(DefaultListableBeanFactory
管理) -
事件发布机制:由
ApplicationEventMulticaster
广播,默认是SimpleApplicationEventMulticaster
-
调用方式:通过反射调用监听方法(同步或异步)
-
事务监听器原理:依赖 Spring 事务同步管理器
TransactionSynchronizationManager
注册回调(参考afterCommit()
机制)
八、事件监听器与设计模式的关系
概念 | 说明 |
---|---|
观察者模式 | 发布者-订阅者解耦核心机制 |
事件驱动架构 | 构建松耦合系统的架构风格 |
回调机制 | 核心依赖监听器回调执行 |
响应式编程 | 是响应事件驱动的现代演进形式(如 WebFlux、RxJava) |
九、总结一句话
Spring 的事件监听机制,是基于“观察者模式 + 事件驱动”的通用设计范式,具备 解耦、灵活、可扩展 的优势,是企业级应用中实现“业务协作”“事务后处理”“系统级通知”的强大工具。