监听者的力量:探索观察者模式和spring使用

观察者模式是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。
观察者模式通常用于实现分布式事件处理系统、新闻代理或MVC框架的一部分。在这种模式中,一个对象(称为“主题”或“可观察对象”)维护一系列依赖于它的对象(称为“观察者”),并在其状态发生变化时自动通知所有观察者。这种模式的主要目的是确保观察者对象在主题对象的状态改变时得到更新。

观察者模式-java实现

import java.util.Observable;
import java.util.Observer;public class ObserverPatternDemo {public static void main(String[] args){Subject subject = new Subject();new BinaryObserver(subject);new OctalObserver(subject);new HexaObserver(subject);System.out.println("First state change: 15");subject.setState(15);System.out.println("Second state change: 10");subject.setState(10);}
}class Subject extends Observable {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;setChanged();notifyObservers();}
}class BinaryObserver implements Observer {public BinaryObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Binary String: " + Integer.toBinaryString(((Subject) o).getState()));}
}class OctalObserver implements Observer {public OctalObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Octal String: " + Integer.toOctalString(((Subject) o).getState()));}
}class HexaObserver implements Observer {public HexaObserver(Subject subject) {subject.addObserver(this);}@Overridepublic void update(Observable o, Object arg) {System.out.println("Hex String: " + Integer.toHexString(((Subject) o).getState()).toUpperCase());}
}

在这个例子中,我们创建了一个Subject类,它继承了Java内置的Observable类,并且在Subject类中定义了一个状态state。当Subject类的状态发生改变时,会调用setChanged()方法和notifyObservers()方法来通知观察者。BinaryObserver、OctalObserver和HexaObserver是观察者类,它们在构造函数中注册到Subject类中。当Subject类的状态发生改变时,它们会接收到通知并且自动更新。

Spring的事件机制的基本概念

Spring的事件机制是Spring框架中的一个重要特性,基于观察者模式实现,它可以实现应用程序中的解耦,提高代码的可维护性和可扩展性。Spring的事件机制包括事件、事件发布、事件监听器等几个基本概念。其中,事件是一个抽象的概念,它代表着应用程序中的某个动作或状态的发生。事件发布是事件发生的地方,它负责产生事件并通知事件监听器。事件监听器是事件的接收者,它负责处理事件并执行相应的操作。在Spring的事件机制中,事件源和事件监听器之间通过事件进行通信,从而实现了模块之间的解耦。以下是使用方法:

  • 通过继承ApplicationEvent,实现自定义事件。是对 Java EventObject 的扩展,表示 Spring 的事件,Spring 中的所有事件都要基于其进行扩展。
public class MyEvent extends ApplicationEvent {private String name;public MyEvent(Object source, String name) {super(source);this.name = name;}@Overridepublic String toString() {return "MyEvent{" +"name='" + name + '\'' +"} " + super.toString();}
}
  • 接下来通过事件发布器将事件发布出去。Spring 中事件发布器有专门的接口 ApplicationEventPublisher:
public interface ApplicationEventPublisher {default void publishEvent(ApplicationEvent event) {publishEvent((Object) event);}void publishEvent(Object event);
}
  • 事件发布方式如下:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);
ctx.publishEvent(new MyEvent(new Demo(), "javaboy"));
  • 实现监听器,事件监听器有两种定义方式。
  1. 实现接口
@Component
public class MyEventListener implements ApplicationListener<MyEvent> {@Overridepublic void onApplicationEvent(MyEvent event) {System.out.println("event = " + event);}
}
  1. 注解:
@Component
public class MyEventListener {@EventListener(value = MyEvent.class)public void hello(MyEvent event) {System.out.println("event02 = " + event);}
}

Spring框架的事件处理机制适用场景

  1. 业务状态变化通知:当应用程序中的某个业务状态发生变化时,可以通过Spring事件机制通知所有感兴趣的组件。例如,用户注册成功后,可以发布一个事件通知其他系统进行相应的处理,如发送欢迎邮件、更新用户统计信息等。
  2. 异步消息处理:在需要处理大量数据或执行耗时操作时,可以利用事件机制进行异步处理。这样可以避免阻塞主线程,提高系统的响应速度和吞吐量。
  3. 组件间的松耦合通信:Spring事件机制允许不同的组件之间进行通信而不需要直接依赖对方。这种松耦合的设计使得组件可以独立地开发、测试和部署,有助于提高系统的整体稳定性。
  4. 插件式架构支持:对于需要支持插件或模块扩展的应用程序,事件机制提供了一个标准化的方式来让插件参与到主程序的运行流程中,而无需修改主程序的代码。
  5. 系统集成与扩展:在进行系统集成或添加新功能时,事件机制可以作为一种灵活的扩展手段,通过定义新的事件和监听器来集成外部服务或增加新的业务逻辑。
  6. 错误处理与监控:在应用程序运行过程中,可能会遇到各种错误或异常情况。通过事件机制,可以将错误信息封装成事件并发布,然后由专门的错误处理组件来监听和处理这些事件,从而实现集中式的错误处理和监控。
  7. 跨服务通信:在微服务架构中,不同服务之间可以通过事件机制来进行通信,实现服务的解耦和灵活交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【Spring IoC】实验四:特殊值处理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

Java4种创建线程方式

目录 一&#xff1a;继承Thread 二&#xff1a;重新Runnable接口 三&#xff1a;Callable 四&#xff1a;lambda 一&#xff1a;继承Thread public static void main(String[] args) {Thread1 t1new Thread1();t1.start(); } class Thread1 extends Thread {Overridepublic…

C++ //练习 10.16 使用lambda编写你自己版本的biggies。

C Primer&#xff08;第5版&#xff09; 练习 10.16 练习 10.16 使用lambda编写你自己版本的biggies。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…

BERTopic安装最全教程及报错处理

BERTopic安装 BERTopic的安装比较复杂,直接安装会报错 安装方法1,.whl文件安装 ERROR: Could not build wheels for hdbscan, which is required to install pyproject.toml-based projects正确安装流程 查看python能安装whl的版本pip debug --verbose Compatible tags: 2…

图表背后的智慧:办公场景中的数据可视化革新

在现代办公场景中&#xff0c;数据可视化的应用已经成为提高效率、推动创新的得力工具。无论是管理层还是普通员工&#xff0c;都能从数据可视化中受益匪浅。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;数据可视化提升了数据的易读性与理解性…

docker安装最新版lastest

docker pull mysql 报missing signature key错误问题原因&#xff1a;如果安装docker用的是yum install docker命令的话&#xff0c;下载下来的docker版本为旧版本&#xff0c;所以会有数字签名有问题 最新版docker安装方法&#xff1a; 卸载旧版本 Docker&#xff08;如果已安…

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…

AQS(抽象队列同步器)

什么是AQS? AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java中用于实现锁和同步器的基础框架。它是一个抽象类&#xff0c;提供了一种灵活且强大的方式来实现各种同步器&#xff0c;如ReentrantLock、Semaphore、CountDownLatch等 AQS实现原理&#xff1f; 1、…

Flink状态存储-StateBackend

文章目录 前言一、MemoryStateBackend二、FSStateBackend三、RocksDBStateBackend四、StateBackend配置方式五、状态持久化六、状态重分布OperatorState 重分布KeyedState 重分布 七、状态过期 前言 Flink是一个流处理框架&#xff0c;它需要对数据流进行状态管理以支持复杂的…

10个技巧,3分钟教会你高效寻找开源项目

作为程序员&#xff0c;不论是开发还是学习&#xff0c;肯定会用到开源项目&#xff0c;那么怎么快速在开源网站找到这些项目呢&#xff1f; 常用的开源网站有&#xff1a;github 和 gitee github是全球最大的开源社区&#xff0c;今天就以github为例&#xff0c;演示一下 gi…

【vue】vue中数据双向绑定原理/响应式原理,mvvm,mvc、mvp分别是什么

关于 vue 的原理主要有两个重要内容&#xff0c;分别是 mvvm 数据双向绑定原理&#xff0c;和 响应式原理 MVC&#xff08;Model-View-Controller&#xff09;&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;表示应用程序的数据和业务逻辑。View&#xff08;视图&…

edge 安装笔记

依赖项&#xff1a; jukebox 下载代码GitHub - rodrigo-castellon/jukebox 拷贝到根目录即可&#xff0c;文件夹留一个根目录jukebox vqvae_cache_path cache_dir "/vqvae.pth.tar" prior_cache_path cache_dir "/prior_level_2.pth.tar"

JavaWeb之 Servlet(2万6千字详解)

目录 前言1. Servlet 简介2. Servlet 前世今生3. Servlet 执行流程4. Servlet 快速入门5. 两种配置 Servlet程序 URL的方式5.1 使用 注解来配置 Servlet程序 的 URL5.1.1 urlPattern 的配置规则精确匹配目录匹配&#xff1a;使用 * 符号代表任意路径扩展名匹配任意匹配 5.1.2 小…

【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱

1 基本定义 SG 滤波算法&#xff08;Savitzky - Golay 滤波算法&#xff09;是一种数字信号处理算法&#xff0c;用于对信号进行平滑处理。该算法利用最小二乘法拟合局部数据段&#xff0c;然后用拟合的函数来估计每个数据点的值&#xff0c;从而实现平滑处理。 SG 滤波算法的…

redis05 sprngboot整合redis

redis的Java客户端 整合步骤 添加redis的pom依赖 <!-- 引入redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 引入redis连…

51单片机学习day02

基于普中的stc89c52&#xff0c; 串口&#xff1a; 通讯接口&#xff0c;51单片机自带UART&#xff08;通用异步收发器&#xff09;&#xff0c;可实现窗口通讯。 硬件电路&#xff1a; 简单双向串口通信有两根通信线&#xff08;发送端TXD和接收端RXD&#xff09;&#xff0…

HelixToolKit的模型旋转操作

前面加载了模型以后&#xff0c;鼠标拖动和缩放比较好操作&#xff1b;但是旋转似乎没有&#xff0c; 操作了一阵&#xff0c;也不是没有&#xff0c;应该是还不熟悉&#xff1b; 旋转的指示器在右下角&#xff0c;现在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

【Java项目介绍和界面搭建】拼图小游戏——添加图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

扼杀网络中的环路:STP、RSTP、MSTP

目录 前言&#xff1a; 一、STP&#xff08;Spanning Tree Protocol&#xff09; 1.1 STP功能 1.2 STP应用 二、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09; 2.1 RSTP功能 2.2 RSTP应用 三、MSTP&#xff08;Multiple Spanning Tree Protocol&#xff0…