Skip to content

09.3 — 事件机制

**返回 进阶源码索引**


事件机制角色

组件职责
ApplicationEvent事件对象,继承自 EventObject
ApplicationListener<E>监听器,泛型指定监听的事件类型
ApplicationEventPublisher事件发布器,ApplicationContext 继承了此接口
ApplicationEventMulticaster事件广播器,默认使用 SimpleApplicationEventMulticaster

使用示例

java
// 1. 自定义事件
public class OrderCreatedEvent extends ApplicationEvent {
    private final Long orderId;
    
    public OrderCreatedEvent(Object source, Long orderId) {
        super(source);
        this.orderId = orderId;
    }
    
    public Long getOrderId() { return orderId; }
}

// 2. 事件监听 — 方式一:实现接口
@Component
public class EmailNotificationListener implements ApplicationListener<OrderCreatedEvent> {
    @Override
    public void onApplicationEvent(OrderCreatedEvent event) {
        // 发送邮件通知
        System.out.println("Send email for order: " + event.getOrderId());
    }
}

// 3. 事件监听 — 方式二:@EventListener(推荐)
@Component
public class SmsNotificationListener {
    
    @EventListener
    @Async  // 异步执行,防止阻塞主流程
    public void handleOrderCreated(OrderCreatedEvent event) {
        // 发送短信通知
        System.out.println("Send SMS for order: " + event.getOrderId());
    }
    
    @EventListener(condition = "#event.orderId % 2 == 0")  // 条件监听
    public void handleEvenOrder(OrderCreatedEvent event) {
        System.out.println("Even order: " + event.getOrderId());
    }
    
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)  // 事务完成后触发
    public void handleAfterCommit(OrderCreatedEvent event) {
        // 事务提交后才执行
    }
}

// 4. 发布事件
@Service
public class OrderService {
    
    @Autowired
    private ApplicationEventPublisher publisher;
    
    @Transactional
    public void createOrder(OrderRequest request) {
        Order order = orderRepository.save(request.toOrder());
        // 发布事件
        publisher.publishEvent(new OrderCreatedEvent(this, order.getId()));
    }
}

内置事件

事件触发时机
ContextRefreshedEventIoC 容器刷新完成
ContextStartedEvent容器调用 start()
ContextStoppedEvent容器调用 stop()
ContextClosedEvent容器关闭
RequestHandledEventHTTP 请求处理完成

Knowledge4J — Java 知识库