什么是 Spring 的事件机制?
在讲 Spring 事件之前,大家可以简单回顾一下设计模式中的观察者模式,这边只简单看一下观察者模式的流程如下:
这边有两个核心的角色:
- Subject (目标):目标也称之为被观察者也就是被观察的对象,当然再实际的工程实现上可能会存在很多具体的目标。
- Observer(观察者):观察者就是对当具体的目标变更的时候做出对应的反应。
ok,简单回顾完观察者模式让我们回到什么是 Spring 的事件机制,简单地说:Spring 的事件机制就是具体的观察者模式的实现。
Spring 中事件机制中各角色:
-
事件
ApplicationEvent
是所有事件对象的父类,也就是说当某个业务发生改变 Spring 可以发出一个事件出来(当然这边可能是具体的某一个事件,Spring 中常用的事件请看第二节介绍)。 -
事件监听
ApplicationListener
,也就是观察者,继承自 JDK 的EventListener
,该类中只有一个方法onApplicationEvent
。当监听的事件发生后该方法会被执行。 -
事件源
ApplicationContext
,ApplicationContext
是 Spring 中的核心容器,在事件监听中ApplicationContext
可以作为事件的发布者,也就是事件源。 -
事件管理
ApplicationEventMulticaster
,用于事件监听器的注册和事件的广播。监听器的注册就是通过它来实现的,它的作用是把Applicationcontext
发布的 Event 广播给它的监听器列表。
Spring 中具体有哪些地方使用了事件机制?
如下图所示是 Spring 中所有的事件继承关系类图:
其中常用的事件有:
-
ContextRefreshedEvent
:初始化或刷新时触发事件 -
ContextStartedEvent
:启动容器触发事件 -
ContextStoppedEvent
:容器停止触发事件 -
ContextClosedEvent
:容器关闭触发事件
这边我们以 ContextRefreshedEvent
为例来介绍一下 Spring 事件发布的流程。
事件派发
从容器启动调用 refresh()
方法进入到 finishRefresh()
方法如下: