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()));
}
}内置事件
| 事件 | 触发时机 |
|---|---|
ContextRefreshedEvent | IoC 容器刷新完成 |
ContextStartedEvent | 容器调用 start() |
ContextStoppedEvent | 容器调用 stop() |
ContextClosedEvent | 容器关闭 |
RequestHandledEvent | HTTP 请求处理完成 |