Spring Event详解 加技术架构图 代码实现
-------------------------------------------------------------------------------------------------------------------
Spring Event 事件驱动机制 超详细完整版
一、什么是 Spring Event
- 作用:同一个微服务内业务解耦
- 特点:内存级、非持久化、同步 / 异步均可
- 局限:仅限本 JVM、服务重启事件丢失、不跨微服务
- 用途:提醒通知、日志记录、状态变更、后置处理
二、核心三大角色
- 事件(Event):自定义业务事件,继承
ApplicationEvent - 发布者(Publisher):
ApplicationEventPublisher发送事件 - 监听者(Listener):
@EventListener监听并处理业务
三、架构原理图(文字可视化架构图)
┌────────────────────────────────── 【单个微服务 JVM内存】──────────────────────────────────┐
│ │
│ 业务Service 【事件发布方】 │
│ publishEvent(自定义事件) │
│ ↓ │
│ Spring 事件中心(内存队列) │
│ ↓↓↓ 多路分发 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 站内信监听 │ │ APP推送监听│ │ 短信通知监听│ │ 日志记录监听│ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────────┘
❌ 无法跨其他微服务
❌ 服务重启、宕机 → 未消费事件全部丢失
❌ 无持久化、无重试机制
架构特点
- 发布方与监听方完全解耦,互不依赖
- 一个事件 → 多个监听器同时执行
- 默认同步执行,加
@Async变为异步 - 无磁盘存储,纯内存运行
四、完整可直接复制代码(案件提醒场景)
1、自定义业务事件(RemindCreatedAfterEvent)
import org.springframework.context.ApplicationEvent;
/**
* 案件提醒创建完成事件
*/
public class RemindCreatedAfterEvent extends ApplicationEvent {
private final LasReminderRecord lasReminderRecord;
public RemindCreatedAfterEvent(LasReminderRecord lasReminderRecord) {
super(lasReminderRecord);
this.lasReminderRecord = lasReminderRecord;
}
public LasReminderRecord getLasReminderRecord() {
return lasReminderRecord;
}
}
2、事件发布(你原有业务代码)
import org.springframework.context.ApplicationEventPublisher;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service
public class CaseRemindService {
@Resource
private ApplicationEventPublisher publishEvent;
public void sendCaseRemind() {
// 1. 保存提醒入库
LasReminderRecord record = saveRemindToDb();
// 2. 发布Spring事件
publishEvent.publishEvent(new RemindCreatedAfterEvent(record));
}
}
3、事件监听(异步处理通知)
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class RemindEventListener {
/**
* 监听提醒创建事件 - 异步处理站内信
*/
@Async
@EventListener
public void handleRemindMsg(RemindCreatedAfterEvent event) {
LasReminderRecord record = event.getLasReminderRecord();
// 业务:发送站内消息
sendInnerMsg(record);
}
/**
* 第二个监听器:APP推送
*/
@Async
@EventListener
public void handleRemindPush(RemindCreatedAfterEvent event) {
// 业务:APP推送通知
}
/**
* 第三个监听器:短信通知
*/
@Async
@EventListener
public void handleRemindSms(RemindCreatedAfterEvent event) {
// 业务:发短信
}
}
4、开启异步配置(启动类加注解)
@SpringBootApplication
@EnableAsync // 开启Spring异步事件
public class CaseApplication {
}
五、同步 VS 异步区别
- 默认同步
- 发布事件 → 等待所有监听器执行完毕才继续
- 事务一致,重启依然会丢
- 监听器报错,会回滚主业务
- @Async 异步
- 主线程立刻结束,后台线程处理
- 性能高
- 服务重启必丢事件,无法回溯
六、核心优缺点总结
优点
- 代码解耦,新增通知不用改原有业务
- 使用简单,Spring 原生,无需中间件
- 一个事件多监听,扩展方便
- 支持事务绑定、有序执行
缺点
- 纯内存,服务重启事件丢失
- 仅限单个微服务,不能跨服务
- 无消息堆积、无重试、无死信
- 大量事件会耗尽 JVM 内存
七、业务选型建议(你的案件提醒)
- 内部流程、日志、状态变更 → 用 Spring Event
- 短信、APP 推送、重要待办提醒 → 必须用 RocketMQ/Kafka(不丢消息、跨服务)
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------

浙公网安备 33010602011771号