Spring Event 是 Spring 框架中用于实现应用程序内部事件发布与监听的一种机制。它基于观察者设计模式,允许应用程序的不同组件之间通过事件进行解耦通信。

Spring Event

Spring Event 的作用

  • 解耦组件:发布事件的组件不需要知道谁来监听事件,监听者也不需要知道事件是由谁发布的。
  • 异步处理:事件可以同步或异步处理,提升系统的响应能力和扩展性。
  • 扩展性强:方便在系统中添加新的事件监听器,增强系统功能。

Spring Event 的核心类和接口

  • ApplicationEvent Spring 事件的基类,所有自定义事件都可以继承它(Spring 4.2 以后,事件可以是任意对象,不必继承 ApplicationEvent)。
  • ApplicationListener 事件监听器接口,实现该接口的类可以监听指定类型的事件。
  • ApplicationEventPublisher 事件发布接口,通常通过 ApplicationContext 实现。

使用步骤

1)定义事件

public class MyCustomEvent extends ApplicationEvent {
    private String message;

    public MyCustomEvent(Object source, String message) {
        super(source);
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

2)定义监听器

@Component
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {
    @Override
    public void onApplicationEvent(MyCustomEvent event) {
        System.out.println("Received event - message: " + event.getMessage());
    }
}

或者使用注解方式:

@Component
public class MyCustomEventListener {
    @EventListener
    public void handleMyCustomEvent(MyCustomEvent event) {
        System.out.println("Received event - message: " + event.getMessage());
    }
}

3)发布事件

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

    public void publish(String message) {
        MyCustomEvent event = new MyCustomEvent(this, message);
        publisher.publishEvent(event);
    }
}

事件发布的同步和异步

      默认情况下,事件监听是同步执行的,即发布事件的线程会等待所有监听器执行完毕。
      如果需要异步执行,可以结合 Spring 的异步支持。

@Component
public class AsyncEventListener {
    @Async
    @EventListener
    public void handleEvent(MyCustomEvent event) {
        // 异步处理事件
    }
}

// 需要在配置类上启用异步支持
@EnableAsync
@Configuration
public class AsyncConfig {
}

Spring 内置事件示例

  • ContextRefreshedEvent:应用上下文刷新完成时发布。
  • ContextStartedEvent:应用上下文启动时发布。
  • ContextStoppedEvent:应用上下文停止时发布。
  • ContextClosedEvent:应用上下文关闭时发布。

      Spring Event 是一种强大且灵活的事件驱动机制,适合用于应用内部组件间的解耦通信。通过自定义事件和监听器,可以实现模块间的松耦合和异步处理,提升系统的可维护性和扩展性。

工程结构

请输入图片描述

  • config(自动配置)

    • LocalTaskMessageAutoConfig:开启异步与定时能力,并进行组件扫描,作为模块的自动装配入口。
  • domain(领域层)

    • 模型:TaskMessageEntityCommand 表示一条任务消息的最小信息。
    • 服务接口:ILocalTaskMessageHandleService 定义接收任务消息入口。
    • 服务实现:LocalTaskMessageHandleService 调用事件发布接口。
    • 事件接口:ILocalTaskMessageEvent 抽象发布事件的能力。
  • infrastructure(基础设施层)

    • 事件对象:SpringTaskMessageEvent 继承 ApplicationEvent,承载任务消息。
    • 事件发布器:LocalTaskMessageEvent 使用 ApplicationEventPublisher 发布事件。
  • trigger(触发/监听层)

    • 监听器:TaskMessageEventListener 使用 @EventListener + @Async 异步处理事件。
最后修改:2026 年 07 月 12 日
如果觉得我的文章对你有用,请随意赞赏