spring boot的applicationevent机制是轻量级发布订阅方案,核心三步:定义事件(继承applicationevent)、发布事件(注入applicationeventpublisher)、监听事件(@eventlistener或applicationlistener);事件同步执行,默认限于单jvm,跨服务需kafka等中间件。

Spring Boot 的 ApplicationEvent 机制是轻量级的发布订阅方案,适合单体应用内部解耦。它不依赖外部中间件,开箱即用,核心就三步:定义事件、发布事件、监听事件。
定义自定义事件类
所有事件必须继承 ApplicationEvent,构造方法里必须调用 super(source),其中 source 通常传 this 或当前 Bean 实例。
- 事件类是普通 Java 类,建议用 final 字段 + 构造注入,保证不可变性
- 推荐使用 Lombok 的
@Getter简化 getter 方法 - 示例:
UserRegisteredEvent extends ApplicationEvent,携带 userId、username 等业务数据
在业务中发布事件
任意 Spring 管理的 Bean(如 @Service)都可注入 ApplicationEventPublisher,调用 publishEvent(new XxxEvent(this, ...)) 即可。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 无需额外配置,Spring 容器自动注入实现类(
SimpleApplicationEventMulticaster) - 也可以通过
ApplicationContext调用publishEvent(),因 ApplicationContext 继承了该接口 - 注意:事件发布是同步的,默认立即执行所有监听器;如需异步,需配合
@Async或@EventListener的异步配置
编写监听器响应事件
监听方式有两种主流写法,推荐用注解方式,更简洁灵活:
-
@EventListener:直接在任意 Spring Bean 的方法上标注,参数类型即监听的事件类型,支持条件过滤(
@EventListener(condition = "..."))、异步(@Async)、事务绑定(@TransactionalEventListener) -
实现 ApplicationListener
:需实现 onApplicationEvent(T event)方法,并用@Component注入容器;适合逻辑简单、复用性高的场景 - 监听器方法必须在 Spring 容器管理的 Bean 中,否则不会被扫描到
进阶要点
实际使用中几个关键细节容易踩坑:
- 事件只在当前 JVM 进程内有效,跨服务或集群不适用——此时应选 Redis Pub/Sub 或 Kafka
- 监听器执行失败会中断后续监听器(默认同步模式),如需容错,建议包裹 try-catch 或改用异步监听
- 若监听逻辑依赖数据库事务结果(比如注册成功后发短信),要用
@TransactionalEventListener并指定phase = TransactionPhase.AFTER_COMMIT - 可通过
@Order或实现Ordered接口控制多个监听器的执行顺序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










