在实际开发中,我们经常会遇到这样的场景: 一个核心业务完成后,需要触发多个后续操作,但又不希望代码彼此强耦合。
例如:用户注册完成 → 发送欢迎邮件、写审计日志、发放新人积分。
如果直接在一个方法里顺序调用,很快就会演变成难以维护的'上帝方法'。
Spring 提供的事件机制(ApplicationEvent),正是为了解决这类问题而生。
一、为什么要用 Spring 事件机制?
1. 传统写法的问题(强耦合)
public void registerUser(String username) {
saveUser(username);
sendWelcomeEmail(username);
addPoints(username);
writeLog(username);
}
这种写法存在明显问题:
- 一个方法承担过多职责
- 每新增一个功能都要修改原方法
- 不利于扩展、测试和维护
- 容易形成'业务泥球'
2. 事件机制的设计思路(解耦)
事件机制的核心思想是 发布–订阅:
注册完成 ↓ 发布「用户注册事件」 ↓ 多个监听器各自处理自己的逻辑
- 注册逻辑 不关心 后续发生什么
- 后续逻辑 只关心事件本身
- 业务之间完全解耦
二、Spring 事件机制的核心原理
Spring 事件机制本质是一个 发布 - 订阅模型(Publish–Subscribe)。
1. 三个核心角色
| 角色 | 说明 |
|---|---|
| Event | 事件本身,表示'发生了什么' |
| Publisher | 事件发布者 |
| Listener | 事件监听者 |
2. 执行流程示意
publishEvent() ↓ ApplicationContext(Spring 事件总线) ↓ 匹配事件类型 ↓ 调用对应的 Listener
只要事件类型匹配,监听器就会被自动调用。
三、简单 Demo
下面通过一个 '用户注册事件' 的示例,完整演示 Spring 事件机制的使用。
1. 定义事件类(Event)
import org.springframework.context.ApplicationEvent;
public class UserRegisteredEvent extends ApplicationEvent {
private final String username;
{
(source);
.username = username;
}
String {
username;
}
}


