spring天然支持事件驱动模型,通过applicationeventpublisher发布事件、applicationlistener或@eventlistener监听,同步执行且由容器管理;自定义事件需继承applicationevent,监听器推荐用@eventlistener并注意事务与异常处理。

Spring 通过内置的事件发布-监听机制(ApplicationEvent / ApplicationListener)天然支持事件驱动模型,无需额外依赖。核心是 事件发布者(ApplicationEventPublisher)与 事件监听器(ApplicationListener 或 @EventListener)协同工作,整个流程由 Spring 容器管理生命周期和线程调度。
定义自定义事件类
继承 ApplicationEvent,推荐使用构造函数传入 source(通常为 this),也可携带业务数据:
<font size="2">public class OrderPaidEvent extends ApplicationEvent {<br> private final String orderId;<br> private final BigDecimal amount;<br><br> public OrderPaidEvent(Object source, String orderId, BigDecimal amount) {<br> super(source);<br> this.orderId = orderId;<br> this.amount = amount;<br> }<br> // getter...</font>
在业务逻辑中发布事件
注入 ApplicationEventPublisher,调用 publishEvent() 即可。Spring 会自动将事件分发给匹配的监听器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 发布时传入事件实例,source 建议设为当前 Service 实例(如
this),便于调试溯源 - 事件发布是同步的(默认),即调用方会等待所有监听器执行完毕;如需异步,需配合
@Async和线程池配置 - 不建议在事务未提交前发布关键事件(如支付成功),否则监听器可能读到未提交数据;可用
@TransactionalEventListener并指定phase = TransactionPhase.AFTER_COMMIT
编写监听器的两种主流方式
方式一:实现 ApplicationListener 接口
<font size="2">@Component<br>public class OrderPaidNotificationListener implements ApplicationListener<orderpaidevent> {<br> @Override<br> public void onApplicationEvent(OrderPaidEvent event) {<br> System.out.println("发送支付成功通知: " + event.getOrderId());<br> }<br>}</orderpaidevent></font>
方式二:使用 @EventListener 注解(更灵活、推荐)
- 支持方法级监听,可直接接收事件对象作为参数,无需泛型声明
- 支持 SpEL 表达式过滤,例如
@EventListener(condition = "#event.amount gt 100") - 支持组合监听多个事件类型:
@EventListener({OrderPaidEvent.class, OrderRefundedEvent.class}) - 配合
@TransactionalEventListener可精准控制监听时机(如仅在事务成功后触发)
事件传播与扩展要点
- Spring 事件默认在同一线程内同步执行,适合轻量、强一致性场景
- 若需解耦或跨服务,应升级为消息中间件(如 RabbitMQ/Kafka),Spring 的事件机制不适用于分布式事件
- 可自定义
SimpleApplicationEventMulticaster来设置任务执行器(Executor),实现异步监听 - 监听器方法抛出异常会中断后续监听器执行(除非显式 try-catch),注意异常隔离设计
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










