監聽者的力量:探索觀察者模式和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.pswp.cn/news/714874.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714874.shtml
英文地址,請注明出處:http://en.pswp.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…