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

一、观察者模式

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

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

Subject:

被观察者,定义被观察者必须实现的职责,能动态的增加取消观察者,它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者。

Observer:

观察者,观察者接受到消息后,即进行更新操作,对接收到的信息进行处理。

ConcreteSubject:

具体的被观察者,定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

ConcreteObserver:

具体的观察者,每个观察者接收到消息后的处理反应是不同的,每个观察者都有自己的处理逻辑。
在这里插入图片描述

使用场景

  • 关联行为场景,关联是可拆分的。(当行为场景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方法实现:
    在这里插入图片描述

ApplicationEventMulticaster的multicastEvent方法的实现在SimpleApplicationEventMulticaster类中:
在这里插入图片描述

最终执行了了onApplicationEvent方法,这里是事件发生的地方
在这里插入图片描述

Spring如何根据事件找到事件对应的监听器的?
在Spring容器初始化的时候,也就是在refresh方法中:(在ApplicationContext的抽象实现类AbstractApplicationContext)
在这里插入图片描述

initApplicationEventMulticaster方法初始化事件注册表:

  • 获得beanFactory
  • 先查找BeanFactory中是否有ApplicationEventMulticaster
  • 如果BeanFactory中不存在,就创建一个SimpleApplicationEventMulticaster
    在这里插入图片描述

在AbstractApplicationEventMulticaster(SimpleApplicationEventMulticaster的父类)类中有如下属性:
在这里插入图片描述

DefaultListenerRetriever的结构如下:

在这里插入图片描述

初始化注册表之后,就会把事件注册到注册表中,registerListeners():(在refresh方法中)
在这里插入图片描述

Spring使用反射机制,通过方法getBeanNamesOfType获取所有继承了ApplicationListener接口的监听器,然后把监听器放到注册表中,所以我们可以在Spring配置文件中配置自定义监听器,在Spring初始化的时候,会把监听器自动注册到注册表中去。

  • 13
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值