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 异步处理事件。