全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

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内置事件

事件触发时机
ContextRefreshedEventApplicationContext刷新完成
ContextStartedEventApplicationContext启动
ContextStoppedEventApplicationContext停止
ContextClosedEventApplicationContext关闭
RequestHandledEventWeb请求处理完成
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绑定事务阶段

📝 发现内容有误?点击此处直接编辑

← 上一篇 ApplicationContextAwareProcessor
下一篇 → Aware 接口
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库