spring事件监听机制是观察者模式的典型实现,以applicationevent为被观察对象、applicationlistener为观察者,通过applicationeventpublisher解耦通知;abstractapplicationcontext作为被观察目标持有监听器集合。

Spring 的事件监听机制底层就是观察者模式的典型实现,核心在于 ApplicationEvent(被观察对象)和 ApplicationListener(观察者)的协作,配合事件发布器 ApplicationEventPublisher 完成解耦通知。
事件与监听器的定义:标准观察者角色划分
Spring 将观察者模式的角色映射为清晰的接口:
-
被观察目标(Subject):不是直接暴露注册/通知逻辑,而是由
AbstractApplicationContext承担——它持有监听器集合(Set<applicationlistener>> listeners</applicationlistener>),并负责广播事件; -
观察者(Observer):即实现
ApplicationListener<t extends applicationevent></t>的类,泛型约束确保只接收特定类型事件; -
事件(Event / Notification):所有事件必须继承
ApplicationEvent,它本身继承自java.util.EventObject,自带时间戳和发布源(source)。
事件发布流程:典型的“推”模型实现
调用 publishEvent(event) 后,Spring 按以下步骤完成通知:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先将原始事件包装为
ApplicationEvent(若未继承则自动包装); - 遍历已注册的监听器(包括早期注册的、通过
@EventListener动态注册的、以及 SmartApplicationListener 等增强类型); - 对每个监听器做类型匹配:
supportsEventType()判断是否接受该事件类型(泛型擦除后靠ResolvableType推断); - 匹配成功后,在合适线程(同步/异步)中调用
onApplicationEvent(event)—— 这就是观察者的响应方法。
监听器注册方式:多种渠道统一归口管理
Spring 支持多种注册路径,但最终都汇聚到 SimpleApplicationEventMulticaster(默认多播器)的监听器列表中:
- 手动注册:
addApplicationListener()或addApplicationListeners(); - 配置类声明:
@Bean方法返回ApplicationListener实例; - 注解驱动:
@EventListener方法会被EventListenerMethodProcessor解析,封装为ApplicationListenerMethodAdapter注册; - 上下文刷新时自动探测:扫描所有
ApplicationListener类型的 Bean 并加入。
扩展点与定制:支持异步、条件过滤与顺序控制
Spring 在基础观察者模式上做了实用增强:
- 异步通知:设置
SimpleApplicationEventMulticaster的taskExecutor,让监听器在独立线程执行; - 条件监听:用
@EventListener(condition = "#event.source == 'user-login'")做 SpEL 表达式过滤; - 监听顺序:实现
Ordered接口或加@Order注解,决定调用先后; - 泛型事件支持:借助
ResolvableType.forInstance(event).getSuperType(ApplicationEvent.class)精准匹配监听器泛型参数。
不复杂但容易忽略的是:Spring 并未暴露传统观察者模式中的“注册/移除”公开 API 给业务代码随意调用,而是通过容器生命周期统一管理,保证了稳定性和一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










