Skip to content

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)。