当前位置: 首页 > news >正文

Spring事件发布监听器ApplicationListener原理- 观察者模式

据说监听器模式也是mq实现的原理, 不过mq我还没来得及深入学习, 先用spring来理解一下吧

Spring事件发布监听器ApplicationListener原理- 观察者模式

  • 什么是观察者模式
    • 一个Demo深入认识一下观察者模式
    • Spring中的事件发布监听
    • ps

什么是观察者模式

大家都听过一个故事叫做烽火戏诸侯
古时候, 总会有人在城墙上守岗, 为的就是观察是否有来兵, 当守卫观察到不远处有来兵, 就会立刻大喊"打仗了, 打仗了", 这个时候,( 同时点起烽火), 那么这个守卫就是观察者, 观察者观察到的打仗这一事件, 会向各方诸侯传播, 大家一起共同对抗敌人
这就是观察者模式

一个Demo深入认识一下观察者模式

一个观察者
在这里插入图片描述

/*** 观察者 观察温度, 湿度 , 气压*/public interface Observer {void update(float temp, float humidity, float pressure);
}

一个"诸侯"- 当前的气候条件
诸侯其实和观察者是同样的, 在战斗来临时, 都要参与打仗这一事件
在这里插入图片描述

/*** @author Green写代码* @date 2024-03-05 18:45* 展示当前的温度适度气压*/
public class CurrentConditionsDisplay implements Observer {/*** 注册一个观察者* @param weatherData*/public CurrentConditionsDisplay(Subject weatherData) {weatherData.resisterObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {System.out.println("当前的温度, 湿度, 气压为:  " + temp + " " + humidity + " " + pressure);}
}

另一个"诸侯" - 统计的气候
在这里插入图片描述

/*** @author Green写代码* @date 2024-03-05 18:45* 统计显示*/
public class StatisticsDisplay implements Observer {public StatisticsDisplay(Subject weatherData) {weatherData.resisterObserver(this);}@Overridepublic void update(float temp, float humidity, float pressure) {System.out.println("统计显示当前温度湿度气压: " + temp + " " + humidity + " " + pressure);}
}

气温的类

import java.util.ArrayList;
import java.util.List;/*** @author Green写代码* @date 2024-03-05 18:45*/
public class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;notifyObserver();}@Overridepublic void resisterObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {int i = observers.indexOf(o);if (i >= 0) {observers.remove(i);}}@Overridepublic void notifyObserver() {for (Observer o : observers) {o.update(temperature, humidity, pressure);}}
}

开始执行

public class ObserverTest {public static void main1(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);weatherData.setMeasurements(0, 0, 0);weatherData.setMeasurements(1, 1, 1);}
}

当设置一个气候的时候setMeasurements, 当前温度和统计温度都要随之变化, 因为他们都继承了观察者, 在温度变化的时候, 要共同update温度

Spring中的事件发布监听

发布一个事件
在这里插入图片描述
监听
在这里插入图片描述
发布和监听是怎么联系起来的呢
我们来看看publishEvent底层

  • 首先会将事件转化为ApplicationContext对象, 暂时不是我们所谈论的重点
    之后会判断是都是一个earlyApplicationEvents , 英译过来是一个早的事件, 什么叫早的事件?大致就是Spring容器启动的时候, 内部做的一些事件监听, 这个和我们所研究的也不匹配
    然后就会走到多播器, 将我们的事件广播出去, 那么监听器就有机会监听到了

在这里插入图片描述
让我们继续看这个多播器做了些啥

在这里插入图片描述
追踪到这里我们发现, 这不是监听器内部的onApplicationEvent吗
到这里监听器完全监听到了事件, 可以执行监听到的事件了

在这里插入图片描述

ps

前面的烽火戏诸侯是我自己想出来的例子, 可能不贴切, 但是观察者本身不是一个很难理解的点, 观察观察, 很容易想明白嘛

相关文章:

  • 策略分析:Atlassian Server版停止支持,Server版用户应该转向数据中心版本还是云版?
  • 探秘分布式神器RMI:原理、应用与前景分析(二)
  • python 运行环境(Docker 容器)
  • 执法仪主板方案定制_MTK平台安卓主板方案商
  • HSRP和VRRP
  • WPF —— ToolBar、Checkbox控价详解
  • 访问一次网站的全过程
  • SSM整合项目(使用Vue3 + Element-Plus创建项目基础页面)
  • 大型文件数据读取并持久化到数据库
  • 力扣--动态规划/回溯算法131.分割回文串
  • 【MacOS原版镜像下载】讲解
  • LaTex 笔记
  • 视频极速切割无损工具免费版,亲测好用!
  • Flutter APP下载更新
  • 新规正式发布 | 百度深度参编《生成式人工智能服务安全基本要求》
  • [PHP内核探索]PHP中的哈希表
  • 【剑指offer】让抽象问题具体化
  • Java反射-动态类加载和重新加载
  • Linux Process Manage
  • MYSQL 的 IF 函数
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Vue组件定义
  • 阿里云应用高可用服务公测发布
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 利用jquery编写加法运算验证码
  • 前言-如何学习区块链
  • 入门到放弃node系列之Hello Word篇
  • 算法系列——算法入门之递归分而治之思想的实现
  • 用mpvue开发微信小程序
  • MyCAT水平分库
  • UI设计初学者应该如何入门?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ###STL(标准模板库)
  • #stm32驱动外设模块总结w5500模块
  • (09)Hive——CTE 公共表达式
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (转载)利用webkit抓取动态网页和链接
  • .net core 6 集成和使用 mongodb
  • .Net Winform开发笔记(一)
  • .NET框架设计—常被忽视的C#设计技巧
  • :=
  • @Autowired @Resource @Qualifier的区别
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [c++] C++多态(虚函数和虚继承)
  • [C++数据结构之看懂就这一篇]图(上)
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue