Spring中的事件驱动模型(一)
本文于2675天之前发表,文中内容可能已经过时。
正月初七,新年第一篇。
事件驱动模型简介
事件驱动模型通常也被理解成观察者或者发布/订阅模型。
- 是一种对象间的一对多的关系;
- 当目标发送改变(发布),观察者(订阅者)就可以接收到改变;
- 观察者如何处理,目标无需干涉,它们之间的关系是松耦合的。
事件驱动模型的例子很多,如生活中的红绿灯,以及我们在微服务中用到的配置中心,当有配置提交时出发具体的应用实例更新Spring上下文环境。
Spring的事件机制
基本概念
Spring的事件驱动模型由三部分组成:
- 事件:ApplicationEvent,继承自JDK的EventObject,所有事件将继承它,并通过source得到事件源。
- 事件发布者:ApplicationEventPublisher及ApplicationEventMulticaster接口,使用这个接口,我们的Service就拥有了发布事件的能力。
- 事件订阅者:ApplicationListener,继承自JDK的EventListener,所有监听器将继承它。
Spring事件驱动过程
事件
Spring 默认对 ApplicationEvent 事件提供了如下实现:
- ContextStoppedEvent:ApplicationContext停止后触发的事件;
- ContextRefreshedEvent:ApplicationContext初始化或刷新完成后触发的事件;
- ContextClosedEvent:ApplicationContext关闭后触发的事件。如web容器关闭时自动会触发Spring容器的关闭,如果是普通java应用,需要调用
ctx.registerShutdownHook()
注册虚拟机关闭时的钩子才行; - ContextStartedEvent:ApplicationContext启动后触发的事件;
1 | public abstract class ApplicationEvent extends EventObject { |
事件基类ApplicationEvent
,所有的具体事件都会继承该抽象事件类。
事件监听者
ApplicationListener
继承自JDK的EventListener
,JDK要求所有监听器将继承它。
1 |
|
提供了onApplicationEvent方法,用以处理ApplicationEvent
,不过对于具体事件的处理需要进行判断。而GenericApplicationListener
和SmartApplicationListener
提供了关于事件更多的元数据信息。
1 | public class SourceFilteringListener implements GenericApplicationListener, SmartApplicationListener { |
SourceFilteringListener
是ApplicationListener
的装饰器类,过滤特定的事件源。只会注入其事件对应的代理监听器,还提供了按照顺序触发监听器等功能。
在启动的时候会加载一部分 ApplicationListener
。Spring Context加载初始化完成(refresh)后会再次检测应用中的 ApplicationListener
,并且注册,此时会将我们实现的 ApplicationListener
就会加入到 SimpleApplicationEventMulticaster
维护的 Listener 集合中。
Spring也支持直接注解的形式进行事件监听@EventListener(Event.class)
。
事件发布
ApplicationContext
接口继承了ApplicationEventPublisher
,并在AbstractApplicationContext
实现了具体代码,实际执行是委托给ApplicationEventMulticaster
。
1 |
|
读者有兴趣可以看一下AbstractApplicationContext
中这部分的逻辑。下面我们具体看一下ApplicationEventMulticaster
接口中定义的方法。
1 | public interface ApplicationEventMulticaster { |
AbstractApplicationContext
中定义了对监听者的操作维护,如增加和删除,并提供了将特定事件进行广播的方法。下面看一下具体实现类SimpleApplicationEventMulticaster
。ApplicationContext
自动到本地容器里找一个ApplicationEventMulticaster
实现,如果没有则会使用默认的SimpleApplicationEventMulticaster
。
1 | public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster { |
在multicastEvent
方法中,executor不为空的情况下,可以看到是支持异步发布事件。发布事件时只需要调用ApplicationContext
中的publishEvent
方法即可进行事件的发布。
总结
本文主要介绍了Spring中的事件驱动模型相关概念。首先介绍事件驱动模型,也可以说是观察者模式,在我们的日常生活中和应用开发中有很多应用。随后重点篇幅介绍了Spring的事件机制,Spring的事件驱动模型由事件、发布者和订阅者三部分组成,结合Spring的源码分析了这三部分的定义与实现。笔者将会在下一篇文章,结合具体例子以及Spring Cloud Config中的实现进行实战讲解。
参考
赞赏是不耍流氓的鼓励
评论系统未开启,无法评论!