springBoot 观察者模式

2023-10-30

观察者设计模式

jie神说用订阅和发布来理解更好,我想了一下是的
为什么呢?因为监听器这个名词听起来是一个主动的,可实际监听器是一个被动的玩意
比如我们事件源发布一个事件,然后监听器订阅了这个事件就能做出动作。
里面涉及到三个对象,事件源,事件、监听器,大家好好理解一下

特点:

  • 持有监听的观察者的引用
  • 支持增加和删除观察者
  • 主题状态改变,通知观察者

观察者implements Observer 重写update方法:

  • 当被观察者发生变化,收到通知进行具体的处理
  • 可以随时取消

优点松耦合:

  • 观察者增加或删除无需修改被观察者的代码,只需调用被观察者对应的增加或者删除的方法即可
  • 被观察者只是负责通知观察者,但无需了解观察者如何处理通知
  • 观察者只需等待被观察者通知,无需观察被观察者相关的细节

有点通知不错过:

  • 由于被动接受,正常情况下不会发生错过主题的改变通知.而主动获取的话,由于时机选取问题,可能导致错过某些状态.

Java实现:

java中有观察者模式使用的API

  • java.util.Observable这是一个类 继承,这是被观察者.
  • java.util.Observer这是一个接口 实现,这是观察者,也是监听器

开关的重要性:

  • 可以筛选通知
  • 可以撤销通知
  • 可以控制通知

Spring中的Events

事件通过org.springframework.context.ApplicationEvent实例来表示。这个抽象类继承扩展了java.util.EventObject,可以使用EventObject中的getSource方法,我们可以很容易地获得所发生的给定事件的对象。这里,事件存在两种类型,其实EventObject就是事件的接口.事件有非常多,都可以实现这个接口,那么这个事件就有自己的东西.

  1. 与应用程序上下文相关联

    所有这种类型的事件都继承自org.springframework.context.event.ApplicationContextEvent类。它们应用于由org.springframework.context.ApplicationContext引发的事件(其构造函数传入的是ApplicationContext类型的参数)。这样,我们就可以直接通过应用程序上下文的生命周期来得到所发生的事件:ContextStartedEvent在上下文启动时被启动,当它停止时启动ContextStoppedEvent,当上下文被刷新时产生ContextRefreshedEvent,最后在上下文关闭时产生ContextClosedEvent
    在这里插入图片描述

  2. 与request 请求相关联

    org.springframework.web.context.support.RequestHandledEvent实例来表示,当在ApplicationContext中处理请求时,它们被引发。

    Spring如何将事件分配给专门的监听器?

这个过程由事件广播器来实现,由org.springframework.context.event.ApplicationEventMulticaster接口的实现表示。此接口定义了3种方法

  1. addApplicationListener() 添加新的监听器**:定义了两种方法来添加新的监听器:addApplicationListener(ApplicationListener<?> listener)addApplicationListenerBean(String listenerBeanName)。当监听器对象已知时,可以应用第一个。如果使用第二个,我们需要将bean name 得到listener对象(依赖查找DL),然后再将其添加到listener列表中
  2. removeApplicationListenerBean(String listenerBeanName) 删除监听器:添加方法一样,我们可以通过传递对象来删除一个监听器(**removeApplicationListener(ApplicationListener<?> listener)**或通过传递bean名称。第三种方法,**removeAllListeners()**用来删除所有已注册的监听器
  3. **multicastEvent(ApplicationEvent event)**将事件发送到已注册的监听器

在JDK当中也封装了事件,但是用到了swing的编程中去了.也就是java中的事件:EventListener,只不过这个接口是用到了swing编程中去了.
EventObject也就是Java当中的事件.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springBoot 观察者模式 的相关文章

  • Grails 3.x bootRun 失败

    我正在尝试在 grails 3 1 11 中运行一个项目 但出现错误 失败 构建失败并出现异常 什么地方出了错 任务 bootRun 执行失败 进程 命令 C Program Files Java jdk1 8 0 111 bin java
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch

随机推荐

  • springboot中使用EasyExcel实现Excel 导入导出

    一 EasyExcel的介绍 EasyExcel 是一款基于 Java 的简单易用的 Excel 文件操作工具 它提供了丰富的 API 可以方便地读取 写入和操作 Excel 文件 支持常见的 Excel 操作 如读取 写入单元格数据 合并
  • httpUtil工具类

    简单httpUtil工具类发送post get请求 package com wt commons utils import com alibaba fastjson JSONObject import lombok extern slf4j
  • 通过宝塔面板部署一个SpringBoot+Vue前后端分离项目的指南(三更)

    采取的部署方案 阿里云服务器 gt FinalShell gt 宝塔面板 近期需要将自己的一个SpringBoot Vue前后端分离项目 并且是分模块开发的项目部署到服务器上 记录一下踩坑的地方 结合C站大佬的解决方案 循循善诱一步步部署到
  • centos7安装Elasticsearch6.2.4

    elasticsearch启动报错 在centos7中使用wget 下载elasticsearch安装 wget https artifacts elastic co downloads elasticsearch elasticsearc
  • 单相锁相放大器,双相锁相放大器(AD630详解)

    电路图是经过资料搜集验证并优化之后 实测好用 B站对应讲解视频链接 如何测量被噪声埋没了的信号 在测量各种物理量 温度 加速度等 时 用传感器将其变换成为电信号 然后输入到分析仪器 测量仪器 中去 但是 仅想获得必要的信号是很难做到的 通常
  • 【沧海拾昧】C# .Net SplitContainer(分割器)控件的使用笔记

    C0202 沧海茫茫千钟粟 且拾吾昧一微尘 沧海拾昧集 CuPhoenix 阅前敬告 沧海拾昧集仅做个人学习笔记之用 所述内容不专业不严谨不成体系 如有问题必是本集记录有谬 切勿深究 目录 一 将窗口绑定到SplitContainer中作为
  • Mybatis-plus常用方法

    Mybatis plus常用方法总结 便携查看 1 单表增删改查 class GgktDemoApplicationTests 注入mapper Autowired private UserMapper userMapper 1 查询 Te
  • JavaScript 实现全选、全不选和反选功能

    网页中使用到表单复选框时 如果有大量的数据需要选择 经常会用到全选或者反选功能 也可能会用到全不选功能 其实是全选的反选 下面使用原生的js来实现一下全选 全不选和反选功能 声明 文章转载链接出自 JavaScript 实现全选 全不选和反
  • 《Leaflet 基础知识点》- 绘制圆、线、矩形和多边形

    前言 注意绘制的都是矢量图层 所以在 Vector Layers 分类下 绘制 圆 官网API 示例 圆 半径 radius 的单位为米 var circle L circle 31 537628173828125 121 19018554
  • 给label绘制下划线

    UIlabel本身没有下划线的属性 使用绘制的方法 添加下滑下 并且赋给该label一个action作为响应方法 实现DIY超链接的效果 调用 import UnderLineLabel h UnderLineLabel label Und
  • naive 路由使用 loadingBar 进度条

    环境 devDependencies vitejs plugin vue 4 2 3 axios 1 4 0 less 4 1 3 less loader 11 1 3 naive ui 2 34 4 pinia 2 1 4 typescr
  • PostMan使用技巧:“status“: 415 解决方案

    前言 该错误的出现 主要原因是Postmanf操作不当所致 下面代码为调用方法入口 一 错误提示信息 二 处理方案 如下图所示 调整传参方式为Body gt raw gt JSON application json 尾言 错误不大 侮辱性极
  • usb:认识usb传输(一)

    文章目录 一 usb发展背景 1 usb特点 2 usb发展 1 更名 2 发展 3 传输速度 4 usb编 解码方式 反向不归零 NRZI 位填充 5 信号传输状态 5 帧 6 通讯过程划分 二 usb的四种传输 1 控制传输 2 中断传
  • UE4鼠标滚轮控制镜头缩放

    蓝图 因为其实实现起来比较简单 所以直接上蓝图 主要是用到了UE4的鼠标滚轮操作映射 每当滑动鼠标滚轮的时候就会传出一个数值 有正有负有0 然后将角色的相机摇臂组件拖进蓝图 获取其中的Target Arm Length变量加上一个数值再重新
  • postman实战:2.参数化csv和json

    在上节课讲解了使用postman做接口测试时 如何设置环境变量和全局变量关联参数 关联环境变量和全局变量中参数时 他们的作用范围再来回顾一下 下面来看一下postman里面关于参数化的应用 首先分析下应用场景 1 某一个接口我们对入参设计了
  • 十二、支持向量机

    def svmm 支持向量机 完善 用超平面对高纬空间中的样本进行分类 为了解决线性不可分问题 引入了核函数 常用核函数有线性核函数 多项式核函数 高斯核函数和sigmoid核函数 API sklearn svm SVC C 1 0 ker
  • 机器学习综述论文笔记:Machine Learning: A Review of Learning Types

    机器学习review Paper Machine Learning A Review of Learning Types 这是一篇关于机器学习的综述 里面简述了各种现有的机器学习技术 1 主要的方法 监督 无监督 强化 1 1 监督学习 数
  • Redis原理篇(二)网络模型

    一 用户空间和内核空间 应用需要通过Linux内核与硬件交互 内核本质也是应用 运行的时候也需要CPU资源 内存资源 用户应用也在消耗这些资源 为了避免用户应用导致冲突甚至内核崩溃 用户应用与内核是分离的 进程的寻址空间会划分为两部分 内核
  • 公司前端vue是用vscode开发工具写的,个人喜欢用idea,但是idea在保存代码的时候会自动去除代码行最后的空格,造成不该修改的地方修改了,影响代码提交

    取消这个功能 File Settings Editor General On Save Remave trailing
  • springBoot 观察者模式

    观察者设计模式 jie神说用订阅和发布来理解更好 我想了一下是的 为什么呢 因为监听器这个名词听起来是一个主动的 可实际监听器是一个被动的玩意 比如我们事件源发布一个事件 然后监听器订阅了这个事件就能做出动作 里面涉及到三个对象 事件源 事