Spring 事件机制
TIP
Spring 事件机制基于观察者模式,实现了应用内部松耦合的事件发布与监听。
自定义事件
java
// 1. 定义事件
public class OrderCreatedEvent extends ApplicationEvent {
private String orderNo;
private BigDecimal amount;
public OrderCreatedEvent(Object source, String orderNo, BigDecimal amount) {
super(source);
this.orderNo = orderNo;
this.amount = amount;
}
// getters...
}事件发布
java
@Component
public class OrderService {
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder(Order order) {
// 业务逻辑
// ...
// 发布事件
publisher.publishEvent(new OrderCreatedEvent(this, order.getOrderNo(), order.getAmount()));
}
}事件监听
方式一:@EventListener 注解
java
@Component
public class OrderEventListener {
@EventListener
public void handleOrderCreated(OrderCreatedEvent event) {
System.out.println("收到订单创建事件:" + event.getOrderNo());
// 发送短信通知、记录日志等
}
@EventListener
@Async // 支持异步处理
public void sendNotification(OrderCreatedEvent event) {
// 异步发送邮件或短信
}
}方式二:实现 ApplicationListener 接口
java
@Component
public class LogEventListener implements ApplicationListener<OrderCreatedEvent> {
@Override
public void onApplicationEvent(OrderCreatedEvent event) {
System.out.println("日志记录:" + event.getOrderNo());
}
}事件执行顺序
java
@Component
public class OrderedListener {
@EventListener
@Order(1) // 优先级,数字越小越先执行
public void first(OrderCreatedEvent event) {
System.out.println("第一个执行");
}
@EventListener
@Order(2)
public void second(OrderCreatedEvent event) {
System.out.println("第二个执行");
}
}事务事件监听
java
@Component
public class OrderEventListener {
// 在事务提交后执行
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void onOrderCreated(OrderCreatedEvent event) {
// 只在事务成功提交后执行
System.out.println("事务已提交,发送MQ消息:" + event.getOrderNo());
}
}TIP
Spring 事件机制适合单体应用内的解耦,跨服务场景推荐使用消息队列(RabbitMQ、RocketMQ、Kafka)。