观察者模式在 Spring 中的应用:ApplicationEvent 与 EventListener 的事件驱动设计
·
观察者模式在 Spring 中的应用:ApplicationEvent 与 EventListener
观察者模式是一种行为设计模式,允许对象(观察者)订阅其他对象(主题)的状态变化。在 Spring 框架中,该模式通过 ApplicationEvent 和 EventListener 实现事件驱动设计,实现组件间的松耦合通信。
1. 核心组件
-
ApplicationEvent
所有事件的基类,自定义事件需继承此类。例如:public class UserRegisteredEvent extends ApplicationEvent { private String username; public UserRegisteredEvent(Object source, String username) { super(source); this.username = username; } // Getter } -
ApplicationEventPublisher
事件发布接口,Spring Bean 可通过其发布事件:@Autowired private ApplicationEventPublisher publisher; public void registerUser(String username) { publisher.publishEvent(new UserRegisteredEvent(this, username)); } -
@EventListener
注解标记事件监听方法:@EventListener public void handleUserEvent(UserRegisteredEvent event) { System.out.println("User registered: " + event.getUsername()); }
2. 工作流程
- 事件发布
业务逻辑中调用publishEvent()发布事件。 - 事件路由
Spring 容器将事件分发给匹配的监听器。 - 事件处理
监听器方法执行响应操作(如发送邮件、更新日志)。
3. 高级特性
-
条件监听
通过 SpEL 表达式指定触发条件:@EventListener(condition = "#event.username.startsWith('admin')") public void handleAdminEvent(UserRegisteredEvent event) { ... } -
异步处理
结合@Async实现异步事件处理:@Async @EventListener public void asyncHandleEvent(UserRegisteredEvent event) { ... } -
事件排序
使用@Order注解控制监听器执行顺序:@Order(1) @EventListener public void firstListener(UserRegisteredEvent event) { ... }
4. 设计优势
- 解耦性
发布者与监听者无需直接引用,通过事件通信。 - 扩展性
新增监听器无需修改发布者代码。 - 灵活性
支持同步/异步处理、条件过滤等场景。
5. 典型应用场景
- 用户注册后发送欢迎邮件
- 订单状态变更时更新库存
- 系统异常时触发告警通知
graph LR
A[业务逻辑] -->|发布事件| B(ApplicationEventPublisher)
B -->|路由事件| C[监听器1]
B -->|路由事件| D[监听器2]
C --> E[发送邮件]
D --> F[记录日志]
注意:Spring Boot 自动配置事件基础设施,只需定义事件和监听器即可使用。这种设计显著降低了组件间的直接依赖,符合开闭原则。
更多推荐
所有评论(0)