程序设计的所有原则和方法论都是追求一件事——简单——功能简单、依赖简单、修改简单、理解简单。因为只有简单才好用,简单才好维护。因此,不应该以评论艺术品的眼光来评价程序设计是否优秀,程序设计的艺术不在于有多复杂多深沉,而在于能用多简单的方式实现多复杂的业务需求;不在于只有少数人能理解,而在于能让更多人理解。
Spring提供了强大的扩展体系,其中本篇介绍的事件机制是其扩展体系中一个主要分支。本篇先介绍Spring事件机制原理,再总结下spring和spring boot启动过程的主要事件,接着通过示例展示了自定义监听器的4种主要的注册方式,最后通过示例介绍了自定义事件的发布方式。
1. spring事件机制原理
1.1 观察者模式
1.1.1 模式介绍
观察者(Observer)模式: 多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
参与者角色:
- Subject: 需要被观察的对象,抽象类
- ConcreteSubject:具体的需要被观察的对象
- Observer: 观察者接口,定义一个有变更时的触发接口
- ConcreteObserver: 具体观察者,实现具体的操作逻辑
观察者模式基本类图如下

1.1.2 观察者模式设计要点
-
Observer设计要点
关于Observer接口方法设计有2种方式:- 以变更类型、事件类型为方法名,如onStateChage()、onNameChange()、onStart()、onClose()等等。这种方式实现简单,但适合变更类型确定的场景。比如spring boot启动事件的监听器
SpringApplicationRunListener的方法设计就采用这种。 - 以抽象事件类型为参数,如onAbstractXxxEvent(AbstractXxxEvent e)。这种方式扩展性强,适合变更类型不确定的场景,但实现方式复杂。spring的
ApplicationContext容器就是采用这种方式实现。
- 以变更类型、事件类型为方法名,如onStateChage()、onNameChange()、onStart()、onClose()等等。这种方式实现简单,但适合变更类型确定的场景。比如spring boot启动事件的监听器
-
Subject设计要点,单一职责原则,一种类型Observer只处理一种类型Subject,比如Spring中
ApplicationContext容器的观察者为ApplicationListener,spring boot的SpringApplication程序的观察者为SpringApplicationRunListener。
1.2 spring事件机制
1.2.1 spring事件设计介绍
spring事件的实现是观察者模式的应用,spring事件监听器类图如下,下面同时也总结了spring的事件监听器接口与spring容器、spring boot有关的类图关系

1.2.2 与观察者模式对比
根据上面类图与观察者类图对比,spring各个类与观察者类图的类映射关系如下:
| spring类 | 观察者类/作用 |
|---|---|
| ApplicationListener | Observer,用于监听spring容器状态 |
| ApplicationEvent | Observer观察ApplicationContext容器状态变更的具体类型,比如容器刷新完成事件ContextRefreshedEvent |
| ApplicationContext | Subject,是ApplicationListener监听的主体对象 |
| ApplicationEventPublisher | 定义Subject的notify相关的方法, 面向应用代码的事件发布器,应用代码可以使用该接口发布事件 |
| ApplicationEventMulticaster | 多播器:把Subject发布的事件分发给具体的ApplicationListener监听器 |
| SpringApplicationRunListener | Observer,用于监听springboot应用程序SpringApplication状态,主要实现为EventPublishingRunListener |
| SpringApplication | Subject,是SpringApplicationRunListener监听的主体对象 |
| SpringApplicationRunListeners | 多播器:把springboot应用启动事件分发给各个SpringApplicationRunListener监听器对象 |
1.2.3 多播器ApplicationEventMulticaster
在Spring事件机制的实现中,ApplicationEventMulticaster多播器是核心部分。它也是外观模式的应用,它的功能实现说明如下:
- 它把对监听器的管理和通知接口从Subject类中分离,这样完全实现了
ApplicationContext与监听器的解耦。 ApplicationEventMulticaster面向接口编程,可以管理任何ApplicationListener对象。- 还可以根据ApplicationEvent事件类型匹配适合的监听器,从而实现监听器之间的独立性。
- 客户端应用代码可以直接通过
ApplicationEventMulticaster对象发送ApplicationEvent事件。
spring中多播器的实现类为SimpleApplicationEventMulticaster,它分发事件的代码如下:
// SimpleApplicationEventMulticaster源码
@Override
public void multicastEvent(ApplicationEvent event) {
multicastEvent(event, null);
}
@Override
public void

最低0.47元/天 解锁文章
1333

被折叠的 条评论
为什么被折叠?



