Java擴展機制:SPI與Spring.factories詳解

一、SPI

SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者擴展的API,它可以用來啟用框架擴展和替換組件。

整體機制圖如下:

SPI機制圖

Java SPI 實際上是“基于接口的編程+策略模式+配置文件”組合實現的動態加載機制。

系統設計的各個抽象,往往有很多不同的實現方案,在面向對象的設計里,一般推薦模塊之間基于接口編程,模塊之間不對實現類進行硬編碼。一旦代碼里涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改代碼。為了實現在模塊裝配的時候能不在程序里動態指明,這就需要一種服務發現機制。

Java SPI就是提供這樣的一個機制:

為某個接口尋找服務實現的機制。有點類似IOC的思想,就是將裝配的控制權移到程序之外,在模塊化設計中這個機制尤其重要。所以SPI的核心思想就是解耦。

準則

  1. 當服務提供者提供了接口的一種具體實現后,在jar包的META-INF/services目錄下創建一個以“接口全限定名”為命名的文件,內容為實現類的全限定名;
  2. 接口實現類所在的jar包放在主程序的classpath中;
  3. 主程序通過java.util.ServiceLoader動態裝載實現模塊,它通過掃描META-INF/services目錄下的配置文件找到實現類的全限定名,并把類加載到JVM;
  4. SPI的實現類必須攜帶一個不帶參數的構造方法。

使用

創建service
public abstract class ApplicationReadyProvider {private static final Log logger = LogFactory.getLog(ApplicationReadyProvider.class);public void launch(ConfigurableApplicationContext applicationContext) {logger.debug("Launch ApplicationReadyProvider: {}", this.getClass().getSimpleName())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/20715.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/20715.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/20715.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

戴爾科技:一盆冷水澆醒了AIPC

這年頭,只要沾上英偉達的公司,不論美股還是大A,都跟著雞犬升天幾輪過,但昨晚英偉達蒸發1064億美元, 跟著遭罪的也不少,有沒有一夜驚魂夢醒的感覺? 今天我們來說說——戴爾科技。 昨晚戴爾科技大跌5.18%&a…

5G無線標準演進綜述及新技術引入

摘 要 隨著經濟和社會的發展,5G業務越來越豐富多彩,1080P高清視頻、裸眼3D、網聯汽車、云手機等新業務、新終端對網絡的要求也越來越高;另一方面,5G標準持續演進,在MIMO、載波聚合、移動性管理、uRLLC、切片、定位等方…

你了解MySQL分區表嗎?知道哪些情況不適用分區表嗎?

一、分區表的使用 簡單來說,分區表就是把物理表結構相同的幾張表,通過一定算法,組成一張邏輯大表。這種算法叫“分區函數”,當前 MySQL 數據庫支持的分區函數類型有 RANGE、LIST、HASH、KEY、COLUMNS。 無論選擇哪種分區函數,都要指定相關列成為分區算法的輸入條件,這些列…

ESP32開發筆記

ESP32 學習筆記 MQTT5 共享訂閱 什么是共享訂閱? 在普通的訂閱中,每發布一條消息,所有匹配的訂閱端都會收到該消息的副本。然而,當某個訂閱端的消費速度無法跟上消息的生產速度時,我們無法將其中一部分消息分流到…

`nano` 文本編輯器快捷鍵使用

在 nano 文本編輯器中,可以幫助用戶高效編輯文本,下面是每個快捷鍵的詳細解釋: 常用快捷鍵 ^G: Help - 顯示幫助信息。這里的 ^ 代表 Ctrl 鍵,因此 ^G 就是 Ctrl G。^O: Write Out - 保存文件。^O 即 Ctrl O,用于將…

模仿庫實現priority_queue

1 priority_queue 1.1 概念 優先級隊列,一種大/小堆(默認為大堆) 1.2 大堆和小堆 一種完全二叉樹,大堆根節點一定比子字節大 小堆根節點一定比子字節小 向下調整 從根節點開始比較與子節點的大小不斷向下 向上調整 找到最后一個非葉子節點&#xf…

mac多媒體影音庫:Emby for Mac 中文版

Emby軟件是一款功能強大的媒體服務器軟件,旨在為用戶提供豐富的多媒體體驗。以下是關于Emby軟件的詳細介紹: 下載地址:https://www.macz.com/mac/7964.html?idOTI2NjQ5Jl8mMjcuMTg2LjE1LjE4Mg%3D%3D 主要功能 媒體管理:Emby允許用…

代碼隨想錄-Day25

216.組合總和III 找出所有相加之和為 n 的 k 個數的組合,且滿足下列條件: 只使用數字1到9 每個數字 最多使用一次 返回 所有可能的有效組合的列表 。該列表不能包含相同的組合兩次,組合可以以任何順序返回。 示例 1: 輸入: k 3, n 7 輸…

Python OCR 圖片轉文字進階:讀光OCR之行檢測模型+行識別模型

Python OCR 圖片轉文字進階:讀光OCR之行檢測模型行識別模型 介紹阿里云文字識別OCR(讀光OCR)前置條件模型1:行檢測模型模型1:行識別模型 代碼:main.py 介紹 什么是OCR? OCR是“Optical Charac…

Leetcode:字符串轉換整數 (atoi)

題目鏈接:8. 字符串轉換整數 (atoi) - 力扣(LeetCode) 普通版本(條件限制) class Solution { public:int myAtoi(string s) {int res 0;int i 0;int flag 1;//假設整數為正while(s[i] )//跳過空格{i;}if(s[i] …

德人合科技——@天銳綠盾 | -文檔透明加密系統

天銳綠盾文檔透明加密系統是一種先進的數據安全解決方案,旨在保護企業和組織的敏感信息,防止未經授權的訪問和泄漏。 PC地址: https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是該系統的一些關鍵特點和功…

[C++11/14新特性] tuple元組介紹

C11 標準新引入了一種類模板,命名為 tuple(中文可直譯為元組)。tuple 最大的特點是:實例化的對象可以存儲任意數量、任意類型的數據。tuple 的應用場景很廣泛,例如當需要存儲多個不同類型的元素時,可以使用…

3D目標檢測入門:探索OpenPCDet框架

前言 在自動駕駛和機器人視覺這兩個飛速發展的領域中,3D目標檢測技術扮演著核心角色。隨著深度學習技術的突破性進展,3D目標檢測算法的研究和應用正日益深入。OpenPCDet,這個由香港中文大學OpenMMLab實驗室精心打造的開源工具箱,…

加密算法簡述

目錄 1 加密算法的分類 2 對稱加密 3 非對稱加密 4 哈希算法 1 加密算法的分類 數據加密的基本過程是將原本的明文數據依照某種算法進行一定的處理,使之成為一段不可讀的密文,只有通過相應的密鑰與算法進行計算后才可顯示出原文。而這個過程中的算法…

【用Python畫畫】六一兒童節畫愛心

本文收錄于 《Python編程入門》專欄,從零基礎開始,分享一些Python編程基礎知識,歡迎關注,謝謝! 文章目錄 一、前言二、代碼示例三、知識點梳理四、總結 一、前言 本文介紹如何使用Python的海龜畫圖工具turtle&#xf…

linux中如和查找端口是否被占用

在Linux系統中&#xff0c;可以使用以下命令來查找特定端口是否被占用&#xff1a; 使用netstat命令&#xff1a; netstat -tuln | grep <port_number>其中&#xff0c;-t表示TCP協議&#xff0c;-u表示UDP協議&#xff0c;-l表示監聽狀態&#xff0c;-n表示顯示端口號…

Docker從安裝開始精通

從虛擬機到容器 1.環境配置的難題 軟件開發最大的麻煩事之一&#xff0c;就是環境配置。用戶計算機的環境都不相同&#xff0c;你怎么知道自家的軟件&#xff0c;能在那些機器跑起來&#xff1f; 用戶必須保證兩件事&#xff1a;操作系統的設置&#xff0c;各種庫和組件的安裝…

堆排序的實現

在上一篇博客中&#xff0c;介紹了堆的實現&#xff0c;現在來介紹一下堆排序。 一.打印有序&#xff1a; 現在先給一個無序的數組&#xff0c;現在我們利用我們實現的堆的功能先完成一下打印排序&#xff1a; 在for循環里是一個建堆的過程&#xff0c;每來一個數據就放入堆中…

c++ map/multimap容器

在C中&#xff0c;std::map 和 std::multimap 是兩種關聯容器&#xff0c;它們包含了可重復的&#xff08;對于 multimap&#xff09;或唯一的&#xff08;對于 map&#xff09;鍵值對。這些容器都根據它們的鍵自動排序&#xff0c;并允許非常快速地根據鍵查找、插入和刪除元素…

監控易監測對象及指標之:深入監測Exchange 2013郵件服務器的關鍵指標

在當今的信息化時代&#xff0c;Exchange 2013郵件服務器因其高效、穩定的特點被廣泛應用于企業通信中。為了確保郵件服務器的持續穩定運行&#xff0c;及時發現并解決潛在問題至關重要。監控易作為一款功能強大的監控工具&#xff0c;為Exchange 2013郵件服務器提供了一系列細…