Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)

Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)

一、观察者模式

观察者模式,Observer Pattern也叫作发布订阅模式Publish/Subscribe。定义对象间一对多的依赖关系,使得每当一个对象改变状态,则所有依赖与它的对象都会得到通知,并被自动更新

观察者模式的几角色名称:

  • . Subject:被观察者,定义被观察者必须实现的职责,能动态的增加取消观察者,它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。
  • . Observer:观察者,观察者接受到消息后,即进行更新操作,对接收到的信息进行处理。
  • . ConcreteSubject:具体的被观察者,定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。
  • . ConcreteObserver:具体的观察者,每个观察者接收到消息后的处理反应是不同的,每个观察者都有自己的处理逻辑。
    Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第1张图片

使用场景

  • . 关联行为场景,关联是可拆分的。(当行为场景1达到某个状态,触发场景2)
  • . 事件多级触发场景。(如审批流程)
  • . 跨系统的消息交换场景,如消息队列的处理机制(如支付下单成功,对客户发信息说已出货,通知物流系统送货,通知库存-1等等)

观察者设计模式特点

  • 被观察者持有观察者的引用
  • 耦合性低,被观察者在特定时间发布特定事件,观察者具体的行为动作由观察者自己决定
  • 提供新增和移除观察者api,可任意扩容观察者数量

二、Java中的观察者模式

java.util.Observable类和java.util.Observer接口。
观察者模式也叫作发布/订阅模式。

三、Spring中的观察者模式

ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。

事件监听机制的应用

  • ApplicationEvent:容器事件,必须被ApplicationContext发布。
  • ApplicationListener:监听器,可由容器中任何监听器Bean担任。
  • 实现了ApplicationListener接口之后,需要实现方法onApplicationEvent(),在容器将所有的Bean都初始化完成之后,就会执行该方法。

事件监听机制原理

Spring在事件处理机制中如何应用观察者模式:

  • 事件,ApplicationEvent,该抽象类继承了EventObject,EventObject是JDK中的类,并建议所有的事件都应该继承自EventObject。
  • 事件监听器,ApplicationListener,是一个接口,该接口继承了EventListener接口。EventListener接口是JDK中的,建议所有的事件监听器都应该继承EventListener。
  • 事件发布,ApplicationEventPublisher,ApplicationContext继承了该接口,在ApplicationContext的抽象实现类AbstractApplicationContext中做了实现

AbstractApplicationContext类中publishEvent方法实现:
Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第2张图片
ApplicationEventMulticaster的multicastEvent方法的实现在SimpleApplicationEventMulticaster类中:
Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第3张图片
最终执行了了onApplicationEvent方法,这里是事件发生的地方
Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第4张图片
Spring如何根据事件找到事件对应的监听器的?
在Spring容器初始化的时候,也就是在refresh方法中:(在ApplicationContext的抽象实现类AbstractApplicationContext)
Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第5张图片
initApplicationEventMulticaster方法初始化事件注册表:

  • 获得beanFactory
  • 先查找BeanFactory中是否有ApplicationEventMulticaster
  • 如果BeanFactory中不存在,就创建一个SimpleApplicationEventMulticaster
    Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第6张图片
    在AbstractApplicationEventMulticaster(SimpleApplicationEventMulticaster的父类)类中有如下属性:Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第7张图片
    DefaultListenerRetriever的结构如下:Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第8张图片
    初始化注册表之后,就会把事件注册到注册表中,registerListeners():(在refresh方法中)Spring的事件监听机制与观察者模式的前世今生(Spring中观察者模式应用:事件监听机制)_第9张图片
    Spring使用反射机制,通过方法getBeanNamesOfType获取所有继承了ApplicationListener接口的监听器,然后把监听器放到注册表中,所以我们可以在Spring配置文件中配置自定义监听器,在Spring初始化的时候,会把监听器自动注册到注册表中去。

你可能感兴趣的:(spring,设计模式,spring,java,设计模式,事件监听,观察者模式)