@eventlistener 是 spring 5.0 引入的轻量级事件监听注解,通过在任意 bean 的 public 方法上标注即可响应事件,支持类型匹配、泛型、多事件监听及 spel 条件过滤;事件推荐使用语义清晰、不可变的 pojo;发布依赖 applicationeventpublisher,支持同步、异步及事务绑定监听,实现高内聚低耦合。

@EventListener 是 Spring 5.0 引入的轻量级事件监听注解,它让方法直接响应应用事件,无需实现接口或继承类,是实现事件驱动解耦最简洁的方式之一。
事件定义:用普通 POJO 承载业务语义
事件本质是一个携带上下文信息的对象,通常继承 ApplicationEvent(可选),但更推荐直接使用普通 Java 类(Spring 4.2+ 支持)。关键在于语义清晰、不可变、便于测试。
- 避免空事件(如
new ApplicationEvent(this)),应封装具体业务数据,例如:UserRegisteredEvent、OrderShippedEvent - 构造时设 final 字段,不提供 setter,保证线程安全与语义稳定性
- 事件类无需任何 Spring 依赖,纯业务逻辑表达
监听方法:用 @EventListener 声明响应逻辑
在任意 Spring 管理 Bean 的任意 public 方法上标注 @EventListener,该方法即成为事件处理器。Spring 自动将其注册为事件监听器。
- 方法参数即事件类型 —— Spring 按类型匹配并注入对应事件实例
- 支持泛型事件(如
@EventListener<userevent></userevent>),编译期类型安全 - 可同时监听多个事件类型:
@EventListener({UserRegisteredEvent.class, UserUpdatedEvent.class}) - 支持条件监听:
@EventListener(condition = "#event.status == 'ACTIVE'"),基于 SpEL 表达式过滤
事件发布:通过 ApplicationEventPublisher 触发
事件解耦的核心在于“发布者不关心谁消费”,只需注入 ApplicationEventPublisher 并调用 publishEvent()。
- 发布者可以是 Service、Controller 或任何 Bean,完全 unaware 监听者存在
- 事件同步发布(默认)—— 监听方法在同一线程执行;如需异步,配合
@Async+ 启用异步支持 - 避免在事务中发布可能被回滚的事件(除非明确需要事务绑定),否则可用
@TransactionalEventListener控制触发时机(如TransactionPhase.AFTER_COMMIT)
解耦效果:职责分离与可插拔性提升
使用 @EventListener 后,新增业务响应无需修改原有发布代码,只需添加一个带注解的方法即可。
- 例如:用户注册后要发邮件、写日志、更新统计,三者分别由三个独立方法监听
UserRegisteredEvent,互不影响 - 某个监听器失效(如邮件服务宕机),不影响其他监听器执行(默认无异常传播)
- 测试时可单独验证事件发布逻辑,再 mock 监听行为,或使用
ApplicationContext.publishEvent()在集成测试中触发
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











