0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SPI是什么?Java SPI的使用介紹

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 2023-09-02 09:58 ? 次閱讀

SPI 是什么

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

整體機(jī)制如下圖

507ef174-48b5-11ee-97a6-92fbcf53809c.png

Java SPI 實(shí)際上是 “基于接口編程+策略模式+配置文件” 組合實(shí)現(xiàn)的動態(tài)加載機(jī)制。

使用場景

適用于:調(diào)用者根據(jù)實(shí)際使用需要,啟用、擴(kuò)展、或者替換框架的實(shí)現(xiàn)策略

比較常見的例子:

數(shù)據(jù)庫驅(qū)動加載接口實(shí)現(xiàn)類的加載,JDBC 加載不同類型數(shù)據(jù)庫的驅(qū)動

日志門面接口實(shí)現(xiàn)類加載,SLF4J 加載不同提供商的日志實(shí)現(xiàn)類

Spring 中大量使用了 SPI, 比如:對 servlet3.0 規(guī)范對 ServletContainerInitializer 的實(shí)現(xiàn)、自動類型轉(zhuǎn)換 Type Conversion SPI (Converter SPI、Formatter SPI) 等

Dubbo 中也大量使用 SPI 的方式實(shí)現(xiàn)框架的擴(kuò)展,不過它對 Java 提供的原生 SPI 做了封裝,允許用戶擴(kuò)展實(shí)現(xiàn) Filter 接口

使用介紹

要使用 Java SPI,需要遵循如下約定:

當(dāng)服務(wù)提供者提供了接口的一種具體實(shí)現(xiàn)后,在 jar 包的 META-INF/services 目錄下創(chuàng)建一個(gè)以 “接口全限定名” 為命名的文件,內(nèi)容為實(shí)現(xiàn)類的全限定名;

接口實(shí)現(xiàn)類所在的 jar 包放在主程序的 classpath 中;

主程序通過 java.util.ServiceLoder 動態(tài)裝載實(shí)現(xiàn)模塊,它通過掃描 META-INF/services 目錄下的配置文件找到實(shí)現(xiàn)類的全限定名,把類加載到 JVM;

SPI 的實(shí)現(xiàn)類必須攜帶一個(gè)不帶參數(shù)的構(gòu)造方法;

總結(jié)

優(yōu)點(diǎn):使用 Java SPI 機(jī)制的優(yōu)勢是實(shí)現(xiàn)解耦,使得第三方服務(wù)模塊的裝配控制的邏輯與調(diào)用者的業(yè)務(wù)代碼分離,而不是耦合在一起。應(yīng)用程序可以根據(jù)實(shí)際業(yè)務(wù)情況啟用框架擴(kuò)展或替換框架組件。

缺點(diǎn):

雖然 ServiceLoader 也算是使用的延遲加載,但是基本只能通過遍歷全部獲取,也就是接口的實(shí)現(xiàn)類全部加載并實(shí)例化一遍。如果你并不想用某些實(shí)現(xiàn)類,它也被加載并實(shí)例化了,這就造成了浪費(fèi)。獲取某個(gè)實(shí)現(xiàn)類的方式不夠靈活,只能通過 Iterator 形式獲取,不能根據(jù)某個(gè)參數(shù)來獲取對應(yīng)的實(shí)現(xiàn)類。

多個(gè)并發(fā)多線程使用 ServiceLoader 類的實(shí)例是不安全的。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動器
    +關(guān)注

    關(guān)注

    51

    文章

    7998

    瀏覽量

    145009
  • SPI接口
    +關(guān)注

    關(guān)注

    0

    文章

    258

    瀏覽量

    34228
  • JAVA語言
    +關(guān)注

    關(guān)注

    0

    文章

    138

    瀏覽量

    20025
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    155

    瀏覽量

    12168
  • 解耦控制
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    10188

原文標(biāo)題:淺析 Java - SPI 機(jī)制

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    JAVA操作英創(chuàng)主板SPI接口簡介

    訪問硬件資源,英創(chuàng)提供了Java硬件支持包,主要支持的工控接口有:以太網(wǎng)、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介紹使用Java語言調(diào)用英創(chuàng)
    發(fā)表于 10-20 13:16

    SPI接口總線介紹

    SPI接口總線介紹 SPI 可以作為主、從器件工作,并可在同一總線上支持多個(gè)主、從器件。SPI 主要使用3 個(gè)信號。(1)主輸出、從
    發(fā)表于 11-24 08:41 ?4798次閱讀
    <b class='flag-5'>SPI</b>接口總線<b class='flag-5'>介紹</b>

    SPI總線簡介與參考實(shí)例

    spi協(xié)議介紹,通過文檔形式說明spi總線時(shí)序
    發(fā)表于 11-19 15:12 ?55次下載

    SPI總線協(xié)議介紹

    這是SPI協(xié)議的介紹,很有用的哦,歡迎大家下載。
    發(fā)表于 04-13 14:21 ?17次下載

    SPI接口的應(yīng)用與基于FPGA的SPI自動發(fā)送模塊設(shè)計(jì)

    SPI 接口應(yīng)用十分廣泛,在很多情況下,人們會用軟件模擬的方法來產(chǎn)生SPI 時(shí)序或是采用帶SPI 功能模塊的MCU。但隨著可編程邏輯技術(shù)的發(fā)展,人們往往需要自己設(shè)計(jì)簡單的SPI 發(fā)送模
    發(fā)表于 10-19 10:33 ?19次下載
    <b class='flag-5'>SPI</b>接口的應(yīng)用與基于FPGA的<b class='flag-5'>SPI</b>自動發(fā)送模塊設(shè)計(jì)

    spi從機(jī)程序設(shè)計(jì)_spi從機(jī)程序代碼詳細(xì)介紹

    本文介紹STM32F407的SPI主從機(jī)通信程序和基于計(jì)數(shù)器的spi從機(jī)程序這兩種spi從機(jī)程序
    發(fā)表于 12-29 15:05 ?3.4w次閱讀
     <b class='flag-5'>spi</b>從機(jī)程序設(shè)計(jì)_<b class='flag-5'>spi</b>從機(jī)程序代碼詳細(xì)<b class='flag-5'>介紹</b>

    英創(chuàng)信息技術(shù)JAVA操作英創(chuàng)主板SPI接口簡介

    資源,英創(chuàng)提供了Java硬件支持包,主要支持的工控接口有:以太網(wǎng)、串口、CAN、GPIO、SPI、I2C、RTC等。本文主要介紹使用Java語言調(diào)用英創(chuàng)
    的頭像 發(fā)表于 02-06 11:09 ?1780次閱讀
    英創(chuàng)信息技術(shù)<b class='flag-5'>JAVA</b>操作英創(chuàng)主板<b class='flag-5'>SPI</b>接口簡介

    fireflyAIO-3288J主板SPI使用介紹

    SPI是一種高速的,全雙工,同步串行通信接口,用于連接微控制器、傳感器、存儲設(shè)備等,本文以指紋識別模塊為例簡單介紹SPI使用。 SPI工作方式
    的頭像 發(fā)表于 12-20 09:41 ?1097次閱讀
    fireflyAIO-3288J主板<b class='flag-5'>SPI</b>使用<b class='flag-5'>介紹</b>

    spi協(xié)議介紹

    文章目錄前言一、SPI介紹1.SPI總線2.尋址方式二、通信原理1.通信過程2.極性和相位3.四種工作模式三、SPI與I2C的異同1.相同點(diǎn)2.不同點(diǎn)總結(jié)前言
    發(fā)表于 12-22 19:21 ?19次下載
    <b class='flag-5'>spi</b>協(xié)議<b class='flag-5'>介紹</b>

    源碼級深度理解Java SPI

    SPI 配置:Java SPI 機(jī)制約定的配置文件,提供查找服務(wù)實(shí)現(xiàn)類的邏輯。配置文件必須置于 META-INF/services 目錄中,并且,文件名應(yīng)與服務(wù)提供者接口的完全限定名保持一致。文件中的每一行都有一個(gè)實(shí)現(xiàn)服務(wù)類的詳
    的頭像 發(fā)表于 11-15 11:38 ?588次閱讀

    Java、Spring、Dubbo三者SPI機(jī)制的原理和區(qū)別

    其實(shí)我之前寫過一篇類似的文章,但是這篇文章主要是剖析dubbo的SPI機(jī)制的源碼,中間只是簡單地介紹了一下Java、Spring的SPI機(jī)制,并沒有進(jìn)行深入,所以本篇就來深入聊一聊這三
    的頭像 發(fā)表于 06-05 15:21 ?860次閱讀
    <b class='flag-5'>Java</b>、Spring、Dubbo三者<b class='flag-5'>SPI</b>機(jī)制的原理和區(qū)別

    SPI通用接口層介紹

    SPI 通用接口層 SPI 通用接口層把具體的 SPI 設(shè)備的協(xié)議驅(qū)動和 SPI 控制器驅(qū)動連接在一起。 負(fù)責(zé) SPI 系統(tǒng)與 Linux
    的頭像 發(fā)表于 07-25 10:52 ?639次閱讀

    什么是SPI機(jī)制

    1、前言 在之前的 JVM 分析系列之類加載 提到過 Java SPI 機(jī)制,主要是類加載器反雙親委派的實(shí)現(xiàn)(第三方包不在指定jdk路徑,一般類加載器無法加載,需要特殊
    的頭像 發(fā)表于 10-08 15:03 ?930次閱讀
    什么是<b class='flag-5'>SPI</b>機(jī)制

    SPI接口介紹

    電子發(fā)燒友網(wǎng)站提供《SPI接口介紹.pdf》資料免費(fèi)下載
    發(fā)表于 10-13 10:49 ?0次下載
    <b class='flag-5'>SPI</b>接口<b class='flag-5'>介紹</b>

    SPI接口的相關(guān)介紹

    SPI和IIC接口一樣是非常常見的開發(fā)板接口,但與IIC相比,SPI設(shè)計(jì)了一種二進(jìn)制流的交互方式,擁有更快的傳輸速度,它可以在任何兩個(gè)嵌入式設(shè)備之間交換消息,ELF1開發(fā)板也是通過SPI接口連接了六
    的頭像 發(fā)表于 12-06 15:49 ?1101次閱讀
    <b class='flag-5'>SPI</b>接口的相關(guān)<b class='flag-5'>介紹</b>