观察者模式在 Spring 中的应用:ApplicationEvent 与 EventListener

观察者模式是一种行为设计模式,允许对象(观察者)订阅其他对象(主题)的状态变化。在 Spring 框架中,该模式通过 ApplicationEventEventListener 实现事件驱动设计,实现组件间的松耦合通信。

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. 工作流程
  1. 事件发布
    业务逻辑中调用 publishEvent() 发布事件。
  2. 事件路由
    Spring 容器将事件分发给匹配的监听器。
  3. 事件处理
    监听器方法执行响应操作(如发送邮件、更新日志)。
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. 典型应用场景
  1. 用户注册后发送欢迎邮件
  2. 订单状态变更时更新库存
  3. 系统异常时触发告警通知
graph LR
A[业务逻辑] -->|发布事件| B(ApplicationEventPublisher)
B -->|路由事件| C[监听器1]
B -->|路由事件| D[监听器2]
C --> E[发送邮件]
D --> F[记录日志]

注意:Spring Boot 自动配置事件基础设施,只需定义事件和监听器即可使用。这种设计显著降低了组件间的直接依赖,符合开闭原则。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐