spring事件机制基于applicationevent和applicationlistener实现轻量级解耦,自定义事件需三步:定义继承applicationevent的事件类(构造函数必传source)、通过applicationeventpublisher发布、用@eventlistener等方式监听。

Spring 提供了基于 ApplicationEvent 和 ApplicationListener 的事件机制,支持轻量级的解耦通信。自定义事件的核心是三步:定义事件类、发布事件、监听事件。整个过程不依赖第三方组件,且天然集成 Spring 容器生命周期。
定义自定义事件类
继承 ApplicationEvent,构造函数必须传入一个 source(通常为事件发起者对象,如 this 或 Service 实例):
public class UserRegisteredEvent extends ApplicationEvent {
private final String username;
private final String email;
public UserRegisteredEvent(Object source, String username, String email) {
super(source);
this.username = username;
this.email = email;
}
// getter 省略
}
注意:source 不限于当前类实例,也可以是 Service、DTO 甚至 null(但不推荐),Spring 会自动将其作为事件上下文的一部分。
在业务中发布事件
通过 ApplicationEventPublisher 发布,推荐用 @Autowired 注入(Spring Boot 默认已配置):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在 Service 方法中调用
publishEvent(new UserRegisteredEvent(this, "alice", "a@b.com")) - 若需异步发布,可配合
@Async(需开启@EnableAsync) - 避免在事务未提交前发布「影响下游一致性」的事件;必要时用
TransactionSynchronizationManager.registerSynchronization()延迟到事务成功后触发
编写监听器响应事件
有三种常用方式,按推荐顺序排列:
-
使用 @EventListener 注解(最简洁):
在任意 Spring Bean 中声明方法,参数类型即监听的事件类型@Service public class UserRegistrationListener { @EventListener public void handleUserRegistered(UserRegisteredEvent event) { System.out.println("新用户注册:" + event.getUsername()); // 发送欢迎邮件、初始化用户积分等 } } -
实现 ApplicationListener 接口(传统方式):
泛型指定监听的事件类型,需手动注册为 Bean - 使用 ContextRefreshedEvent 等内置事件做启动逻辑:适合初始化缓存、预热数据等场景
@EventListener 支持条件监听(@EventListener(condition = "#event.username.startsWith('test')"))和排序(@Order)。
进阶:事件传播与异常处理
默认情况下,监听器内抛出异常会中断后续监听器执行,且向上冒泡到发布方。若需容错:
- 监听方法内部 try-catch 自行处理异常
- 用
@TransactionalEventListener替代@EventListener,支持绑定到事务阶段(如TransactionPhase.AFTER_COMMIT) - 监听器 Bean 若为 prototype 作用域,每次事件都会新建实例(较少用,注意资源泄漏)
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










