ApplicationListener 和 ApplicationEvent
Spring事件机制基于观察者模式,实现Bean之间的解耦通信。
核心组件
| 组件 | 作用 |
|---|---|
| ApplicationEvent | 事件对象,携带事件数据 |
| ApplicationListener | 事件监听器,处理事件 |
| ApplicationEventPublisher | 事件发布器,发布事件 |
自定义事件
Java
// 自定义事件类
public class UserCreatedEvent extends ApplicationEvent {
private Long userId;
private String username;
public UserCreatedEvent(Object source, Long userId, String username) {
super(source);
this.userId = userId;
this.username = username;
}
public Long getUserId() { return userId; }
public String getUsername() { return username; }
}
监听器实现
方式一:实现ApplicationListener
Java
@Component
public class UserCreatedListener implements ApplicationListener<UserCreatedEvent> {
@Override
public void onApplicationEvent(UserCreatedEvent event) {
System.out.println("用户创建: " + event.getUsername());
// 发送欢迎邮件
emailService.sendWelcomeEmail(event.getUserId());
}
}
方式二:@EventListener注解
Java
@Component
public class UserEventListener {
@EventListener
public void handleUserCreated(UserCreatedEvent event) {
System.out.println("用户创建事件: " + event.getUsername());
}
// 监听多种事件
@EventListener({UserCreatedEvent.class, UserDeletedEvent.class})
public void handleUserEvents(ApplicationEvent event) {
if (event instanceof UserCreatedEvent) {
// 处理创建
} else if (event instanceof UserDeletedEvent) {
// 处理删除
}
}
// 条件过滤
@EventListener(condition = "#event.username.startsWith('admin')")
public void handleAdminUser(UserCreatedEvent event) {
System.out.println("管理员用户创建");
}
}
事件发布
Java
@Service
public class UserService {
@Autowired
private ApplicationEventPublisher eventPublisher;
public void createUser(User user) {
userRepository.save(user);
// 发布事件
eventPublisher.publishEvent(
new UserCreatedEvent(this, user.getId(), user.getUsername())
);
}
}
异步事件监听
Java
@Component
public class AsyncUserEventListener {
@EventListener
@Async // 异步处理
public void handleAsync(UserCreatedEvent event) {
// 异步执行,不阻塞主流程
Thread.sleep(1000);
System.out.println("异步处理用户创建");
}
}
// 启用异步
@Configuration
@EnableAsync
public class AsyncConfig { }
监听器顺序
Java
@Component
public class OrderedListener {
@EventListener
@Order(1) // 优先级
public void firstHandler(UserCreatedEvent event) {
System.out.println("第一个处理");
}
@EventListener
@Order(2)
public void secondHandler(UserCreatedEvent event) {
System.out.println("第二个处理");
}
}
Spring内置事件
| 事件 | 触发时机 |
|---|---|
| ContextRefreshedEvent | ApplicationContext刷新完成 |
| ContextStartedEvent | ApplicationContext启动 |
| ContextStoppedEvent | ApplicationContext停止 |
| ContextClosedEvent | ApplicationContext关闭 |
| RequestHandledEvent | Web请求处理完成 |
Java
@Component
public class ContextLifecycleListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("容器刷新完成,所有Bean已就绪");
}
}
事务绑定事件
Java
@Component
public class TxEventListener {
// 事务成功提交后执行
@EventListener
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
public void afterCommit(UserCreatedEvent event) {
System.out.println("事务提交后执行");
}
// 事务回滚前执行
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void beforeCommit(UserCreatedEvent event) {
System.out.println("事务提交前执行");
}
// 事务回滚后执行
@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
public void afterRollback(UserCreatedEvent event) {
System.out.println("事务回滚后执行");
}
}
要点总结
- ApplicationEvent承载事件数据,继承ApplicationEvent
- ApplicationListener或@EventListener实现监听
- ApplicationEventPublisher发布事件
- @Async实现异步监听,不阻塞主流程
- @Order控制监听器执行顺序
- @TransactionalEventListener绑定事务阶段
📝 发现内容有误?点击此处直接编辑