Spring 事件机制是基于观察者模式(Observer Pattern)实现的,用于在应用程序内部实现松耦合的组件间通信。以下是 Spring 事件机制的详细解析:
1. 核心组件
-
ApplicationEvent
所有事件的基类,自定义事件需继承此类。public class CustomEvent extends ApplicationEvent { public CustomEvent(Object source) { super(source); } }
-
ApplicationListener<E extends ApplicationEvent>
事件监听器接口,实现onApplicationEvent
方法处理事件。@Component public class CustomEventListener implements ApplicationListener<CustomEvent> { @Override public void onApplicationEvent(CustomEvent event) { // 处理事件逻辑 } }
-
ApplicationEventPublisher
事件发布接口,由ApplicationContext
实现,用于触发事件。@Autowired private ApplicationEventPublisher publisher; public void doSomething() { publisher.publishEvent(new CustomEvent(this)); }
-
ApplicationEventMulticaster
事件广播器,负责将事件分发给所有匹配的监听器。
2. 事件机制工作流程
- 发布事件
通过ApplicationEventPublisher.publishEvent()
发布事件。 - 事件广播
ApplicationEventMulticaster
将事件广播给所有注册的监听器。 - 监听器处理
匹配类型的ApplicationListener
执行onApplicationEvent
方法。
3. 自定义事件与监听器
3.1 自定义事件
public class OrderCreatedEvent extends ApplicationEvent {
private String orderId;
public OrderCreatedEvent(Object source, String orderId) {
super(source);
this.orderId = orderId;
}
// getter...
}
3.2 监听器实现方式
-
方式1:实现
ApplicationListener
接口@Component public class OrderCreatedListener implements ApplicationListener<OrderCreatedEvent> { @Override public void onApplicationEvent(OrderCreatedEvent event) { System.out.println("订单创建: " + event.getOrderId()); } }
-
方式2:使用
@EventListener
注解(Spring 4.2+)@Component public class OrderEventListener { @EventListener public void handleOrderCreated(OrderCreatedEvent event) { // 处理逻辑 } }
4. 同步与异步事件处理
4.1 默认同步处理
- 事件监听器的执行会阻塞发布者线程。
- 优点:简单,天然支持事务传播。
- 缺点:性能瓶颈。
4.2 异步处理
-
方式1:
@Async
+@EnableAsync
@Configuration @EnableAsync public class AsyncConfig {} @Component public class AsyncEventListener { @Async @EventListener public void asyncHandle(OrderCreatedEvent event) { // 异步处理逻辑 } }
-
方式2:配置
TaskExecutor
@Bean public ApplicationEventMulticaster applicationEventMulticaster() { SimpleApplicationEventMulticaster multicaster = new SimpleApplicationEventMulticaster(); multicaster.setTaskExecutor(taskExecutor()); // 自定义线程池 return multicaster; }
5. 事务绑定事件
使用 @TransactionalEventListener
将事件监听与事务阶段绑定:
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void handleAfterCommit(OrderCreatedEvent event) {
// 事务提交后执行
}
- 事务选项:
BEFORE_COMMIT
:事务提交前AFTER_COMMIT
(默认):事务提交后AFTER_ROLLBACK
:事务回滚后AFTER_COMPLETION
:事务完成后(无论提交或回滚)
6. 应用场景
- 解耦业务逻辑
例如:用户注册后发送邮件、更新统计信息。 - 跨模块通信
例如:订单创建后触发库存扣减。 - 事务后操作
在事务提交后执行日志记录或异步通知。
7. 高级配置
7.1 监听器排序
使用 @Order
注解定义监听器执行顺序:
@EventListener
@Order(1)
public void firstListener(OrderCreatedEvent event) {}
@EventListener
@Order(2)
public void secondListener(OrderCreatedEvent event) {}
7.2 条件化监听
通过 condition
属性过滤事件:
@EventListener(condition = "#event.orderId.startsWith('VIP')")
public void handleVIPOrder(OrderCreatedEvent event) {}
7.3 父子上下文事件传播
默认情况下,父子 ApplicationContext
的事件不共享。若需传播,需显式配置:
childContext.setParent(parentContext);
childContext.addApplicationListener(new ParentContextListener());
8. 常见问题
- 循环事件触发
避免在监听器中再次发布事件,导致无限循环。 - 事务边界
同步监听器中的异常会回滚事务,需谨慎处理。 - 性能瓶颈
高频事件建议使用异步或消息队列(如 RabbitMQ、Kafka)。
9. 总结
Spring 事件机制通过观察者模式实现松耦合通信,支持同步/异步处理、事务绑定及条件过滤。合理使用可提升代码可维护性,但需注意性能与事务管理。对于分布式场景,建议结合消息中间件来使用(如 Spring Cloud Stream)。