Spring 事件机制
1.1 核心概念
1.1.1 事件(Event)
- 事件是继承自 ApplicationEvent 的类,用于封装需要传递的信息。
- 事件通常是自定义的,表示某种特定的动作或状态变化。
import org.springframework.context.ApplicationEvent;
public class MyCustomEvent extends ApplicationEvent {
private final String message;
public MyCustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
1.1.2 事件发布者(Publisher)
- 使用 ApplicationEventPublisher 发布事件。
- Spring 的任何 Bean 都可以是一个事件发布者。
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Component;
@Component
public class MyEventPublisher {
private final ApplicationEventPublisher publisher;
public MyEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void publishEvent(String message) {
MyCustomEvent event = new MyCustomEvent(this, message);
publisher.publishEvent(event);
}
}
1.1.3 事件监听器(Listener)
- 使用 @EventListener 或实现 ApplicationListener 接口来监听事件。
- 当事件被触发时,监听器会执行对应的逻辑。
基于注解的监听器:
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class MyEventListener {
@EventListener
public void handleMyCustomEvent(MyCustomEvent event) {
System.out.println("Received event - " + event.getMessage());
}
}
实现接口的监听器:
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) {
System.out.println("Received event - " + event.getMessage());
}
}
1.2 事件机制流程
- 事件发布者调用 publishEvent() 发布一个事件。
- Spring 的事件广播器(SimpleApplicationEventMulticaster)负责将事件分发给所有符合条件的监听器。
- 监听器接收到事件并执行对应的处理逻辑。
1.3 实际应用场景
- 解耦业务逻辑:比如,用户注册成功后发送欢迎邮件和日志记录,两个操作通过事件机制解耦。
- 应用状态变化通知:系统中某个模块状态变化时,通知其他模块执行相关处理。
- 异步事件处理:Spring 事件机制支持异步事件处理(通过线程池)。
@Component
public class AsyncEventListener {
@EventListener
@Async
public void handleEvent(MyCustomEvent event) {
System.out.println("Processing event asynchronously: " + event.getMessage());
}
}
1.4 常见注意事项
- 默认情况下,事件监听器在同一个线程中执行,可以通过 @Async 实现异步。
- 自定义事件必须继承 ApplicationEvent(Spring 4.2+ 不强制要求,但推荐这样做)。
- 发布事件的组件需要被 Spring 容器管理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。