1. 核心组件

1.1 事件(ApplicationEvent)

  • 所有事件的抽象基类,自定义事件需继承它。

  • 示例:ContextRefreshedEvent(容器刷新事件)、自定义业务事件。

1.2 事件发布者(ApplicationEventPublisher)

  • Spring容器实现了该接口,通过publishEvent()方法发布事件。

  • 任何Bean均可通过注入ApplicationEventPublisher来发布事件。

1.3 事件监听器(ApplicationListener)

  • 实现ApplicationListener接口或使用@EventListener注解的Bean。

  • 监听特定类型的事件并执行处理逻辑。


2. 工作流程

2.1 事件发布

java

@Component
public class OrderService {
    @Autowired
    private ApplicationEventPublisher publisher;

    public void createOrder() {
        // 发布自定义事件
        publisher.publishEvent(new OrderCreatedEvent(this, orderId));
    }
}

2.2 事件监听

方式一:实现ApplicationListener接口

java

@Component
public class OrderEventListener implements ApplicationListener<OrderCreatedEvent> {
    @Override
    public void onApplicationEvent(OrderCreatedEvent event) {
        // 处理订单创建事件
        System.out.println("订单已创建:" + event.getOrderId());
    }
}
方式二:使用@EventListener注解(推荐)

java

@Component
public class OrderEventHandler {
    @EventListener
    public void handleOrderCreated(OrderCreatedEvent event) {
        // 处理事件
    }
}

3. 底层机制

3.1 事件广播器(ApplicationEventMulticaster)

  • Spring容器初始化时创建SimpleApplicationEventMulticaster作为默认广播器。

  • 负责管理监听器列表并将事件分发给匹配的监听器。

3.2 同步/异步执行

  • 默认同步:监听器与事件发布者在同一线程中执行。

  • 异步支持

    java

    @EventListener
    @Async
    public void asyncHandle(OrderCreatedEvent event) {
        // 异步处理
    }

    需配合@EnableAsync启用异步。

3.3 监听器注册流程

  1. 容器启动时扫描所有实现ApplicationListener或标注@EventListener的Bean。

  2. 将监听器注册到ApplicationEventMulticaster中。

  3. 事件发布时,广播器通过getApplicationListeners()找到匹配的监听器并调用。


4. 高级特性

4.1 条件监听

java

@EventListener(condition = "#event.orderId > 1000")
public void handleLargeOrder(OrderCreatedEvent event) {
    // 仅处理orderId大于1000的事件
}

4.2 监听多事件

java

@EventListener(classes = {OrderCreatedEvent.class, OrderUpdatedEvent.class})
public void handleMultipleEvents(ApplicationEvent event) {
    // 处理多种事件
}

4.3 发布事件并获取返回

java

@EventListener
public List<Notification> handleEvent(OrderEvent event) {
    // 返回结果会被作为新事件发布
    return Arrays.asList(new Notification("Order processed"));
}

5. 源码关键流程

  1. AbstractApplicationContext.publishEvent()

    • 转换事件为ApplicationEvent类型

    • 委托给ApplicationEventMulticaster

  2. SimpleApplicationEventMulticaster.multicastEvent()

    • 遍历所有监听器

    • 通过Executor支持异步(默认同步执行)

  3. EventListenerMethodProcessor

    • 处理@EventListener注解的后处理器


6. 应用场景

  • 业务逻辑解耦(如订单创建后发送邮件、更新库存)

  • 系统内部状态变更通知

  • 跨模块通信

  • 微服务架构中的领域事件


总结

Spring事件监听通过发布-订阅模式实现了组件间的松耦合通信,结合Spring容器的生命周期管理,提供了灵活的事件处理机制。开发者可以通过接口或注解快速实现事件驱动编程,同时通过异步处理、条件过滤等特性满足复杂业务需求。

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐