色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

JDK內置的一種服務SPI機制

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-02-15 09:15 ? 次閱讀

SPI(Service Provider Interface)是JDK內置的一種服務提供發現機制,可以用來啟用框架擴展和替換組件,主要用于框架中開發,例如Dubbo、Spring、Common-Logging,JDBC等采用采用SPI機制,針對同一接口采用不同的實現提供給不同的用戶,從而提高了框架的擴展性。

Java SPI實現

Java內置的SPI通過java.util.ServiceLoader類解析classPath和jar包的META-INF/services/目錄 下的以接口全限定名命名的文件,并加載該文件中指定的接口實現類,以此完成調用。

示例說明

創建動態接口

publicinterfaceVedioSPI
{
voidcall();
}

實現類1

publicclassMp3VedioimplementsVedioSPI
{
@Override
publicvoidcall()
{
System.out.println("thisismp3call");
}

}

實現類2

publicclassMp4VedioimplementsVedioSPI
{
@Override
publicvoidcall()
{
System.out.println("thisismp4call");
}

}

在項目的source目錄下新建META-INF/services/目錄下,創建com.skywares.fw.juc.spi.VedioSPI文件。

2dc32b86-ac5d-11ed-bfe3-dac502259ad0.png

相關測試

publicclassVedioSPITest
{
publicstaticvoidmain(String[]args)
{
ServiceLoaderserviceLoader=ServiceLoader.load(VedioSPI.class);

serviceLoader.forEach(t->{
t.call();
});
}
}

說明:Java實現spi是通過ServiceLoader來查找服務提供的工具類。

運行結果:

2dd556f8-ac5d-11ed-bfe3-dac502259ad0.png

源碼分析

上述只是通過簡單的示例來實現下java的內置的SPI功能。其實現原理是ServiceLoader是Java內置的用于查找服務提供接口的工具類,通過調用load()方法實現對服務提供接口的查找,最后遍歷來逐個訪問服務提供接口的實現類。

2de67e92-ac5d-11ed-bfe3-dac502259ad0.png

從源碼可以發現:

ServiceLoader類本身實現了Iterable接口并實現了其中的iterator方法,iterator方法的實現中調用了LazyIterator這個內部類中的方法,迭代器創建實例。

所有服務提供接口的對應文件都是放置在META-INF/services/目錄下,final類型決定了PREFIX目錄不可變更。

雖然java提供的SPI機制的思想非常好,但是也存在相應的弊端。具體如下:

Java內置的方法方式只能通過遍歷來獲取

服務提供接口必須放到META-INF/services/目錄下。

針對java的spi存在的問題,Spring的SPI機制沿用的SPI的思想,但對其進行擴展和優化。

Spring SPI

Spring SPI沿用了Java SPI的設計思想,Spring采用的是spring.factories方式實現SPI機制,可以在不修改Spring源碼的前提下,提供Spring框架的擴展性。

Spring 示例

定義接口

publicinterfaceDataBaseSPI
{
voidgetConnection();
}

相關實現

##DB2實現
publicclassDB2DataBaseimplementsDataBaseSPI
{
@Override
publicvoidgetConnection()
{
System.out.println("thisdatabaseisdb2");
}

}

##Mysql實現
publicclassMysqlDataBaseimplementsDataBaseSPI
{
@Override
publicvoidgetConnection()
{
System.out.println("thisismysqldatabase");
}

}

1、在項目的META-INF目錄下,新增spring.factories文件

2df71af4-ac5d-11ed-bfe3-dac502259ad0.png

2、填寫相關的接口信息,內容如下:

com.skywares.fw.juc.springspi.DataBaseSPI=com.skywares.fw.juc.springspi.DB2DataBase,com.skywares.fw.juc.springspi.MysqlDataBase

說明多個實現采用逗號分隔。

相關測試類

publicclassSpringSPITest
{
publicstaticvoidmain(String[]args)
{
ListdataBaseSPIs=SpringFactoriesLoader.loadFactories(DataBaseSPI.class,
Thread.currentThread().getContextClassLoader());

for(DataBaseSPIdatBaseSPI:dataBaseSPIs){
datBaseSPI.getConnection();
}
}
}

輸出結果

2e061d9c-ac5d-11ed-bfe3-dac502259ad0.png

從示例中我們看出,Spring 采用spring.factories實現SPI與java實現SPI非常相似,但是spring的spi方式針對java的spi進行的相關優化具體內容如下:

Java SPI是一個服務提供接口對應一個配置文件,配置文件中存放當前接口的所有實現類,多個服務提供接口對應多個配置文件,所有配置都在services目錄下;

Spring factories SPI是一個spring.factories配置文件存放多個接口及對應的實現類,以接口全限定名作為key,實現類作為value來配置,多個實現類用逗號隔開,僅spring.factories一個配置文件。

那么spring是如何通過加載spring.factories來實現SpI的呢?我們可以通過源碼來進一步分析。

源碼分析

2e1b1332-ac5d-11ed-bfe3-dac502259ad0.png

說明:loadFactoryNames解析spring.factories文件中指定接口的實現類的全限定名,具體實現如下:

2e312384-ac5d-11ed-bfe3-dac502259ad0.png

說明:獲取所有jar包中META-INF/spring.factories文件路徑,以枚舉值返回。遍歷spring.factories文件路徑,逐個加載解析,整合factoryClass類型的實現類名稱,獲取到實現類的全類名稱后進行類的實例話操作,其相關源碼如下:

2e4bdbb6-ac5d-11ed-bfe3-dac502259ad0.png

說明:實例化是通過反射來實現對應的初始化。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2980

    瀏覽量

    105673
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1731

    瀏覽量

    92836
  • JDBC
    +關注

    關注

    0

    文章

    25

    瀏覽量

    13462

原文標題:深入剖析 Spring Boot 的 SPI 機制

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    JDK動態代理的原理

    在Java中,動態代理是一種機制,允許在運行時動態地創建代理對象來代替某個實際對象,從而在其前后執行額外的邏輯。 為什么JDK動態代理只能代理接口實現類,原因是JDK動態代理是基于接口
    的頭像 發表于 09-30 10:51 ?673次閱讀

    Java的SPI機制詳解

    作者:京東物流 楊葦葦 1.SPI簡介 SPI(Service Provicer Interface)是Java語言提供的一種接口發現機制,用來實現接口和接口實現的解耦。簡單來說,就是
    的頭像 發表于 03-05 11:35 ?376次閱讀
    Java的<b class='flag-5'>SPI</b><b class='flag-5'>機制</b>詳解

    請問板子的延遲函數是一種什么機制

    我想請問下,你們板子的延遲函數是一種什么機制,如以上的定義所示,他的延時單位是ms還是其他,就像Delay(0x000FFFFF)算是延時了多少秒?有沒有相關的資料視屏什么的講解
    發表于 10-15 10:40

    怎樣去設計一種同步補償機制(CDCO算法)?

    本文基于發送方接收方雙向同步算法的原理,提出一種基于時鐘漂移與偏移的同步補償機制(CDCO算法)。
    發表于 05-17 06:18

    分享一種高性能的FM內置天線解決方案

    分享一種高性能的FM內置天線解決方案
    發表于 05-26 06:18

    是否有一種機制可以從虛擬功能處理程序進行屏幕轉換呢?

    我想知道是否有一種機制可以根據在滾動列表控件(小部件)上選擇的項目轉換到不同的屏幕,并傳遞有關所選項目或所選滾動列表項目的索引的信息,或者是否有一種機制可以從虛擬功能處理程序進行屏幕轉
    發表于 12-13 08:09

    一種基于最優網格的動態數據過濾機制

    數據過濾機制是數據分發管理的核心,直接影響數據分發管理效率。該文提出一種基于最優網格的動態數據過濾機制,分析網格單元大小與更新區域網格數量、冗余信息數量的關系
    發表于 04-14 09:06 ?18次下載

    一種高效的磁盤隊列I/O機制

    分析了傳統磁盤隊列的存儲管理開銷和讀寫性能,針對磁盤隊列I/O已成為影響消息服務器性能的首要瓶頸,提出了一種高效磁盤隊列I/O機制—FlashQ。FlashQ采用物理上連續的磁盤塊
    發表于 05-14 19:51 ?32次下載

    一種基于市場機制的隨機服務系統模型

             在市場機制的網格環境中對大量的用戶進行有效的排隊是很有必要的。本文以隨機服務系統理論為基礎針對網格計算提出了一種基于市場
    發表于 09-05 08:48 ?16次下載

    一種ad hoc網信任聲譽評估機制

    在Ad hoc 網絡中,設計一種有效的機制來確保信息包的有效傳遞是研究重點。本文提出了一種信任聲譽評估機制,不同于以往根據位置評估聲譽和處理惡意節點散播虛假聲譽的
    發表于 09-22 10:24 ?5次下載

    SPI模式下MMC卡的讀寫機制

    SPI模式下MMC卡的讀寫機制  多媒體卡MMC(MultiMedia Card)是由美國SanDisk公司和德國Simens公司于1997年共同開發的一種多功能Flash存儲設備。基于ARM7芯
    發表于 03-29 15:13 ?1259次閱讀
    <b class='flag-5'>SPI</b>模式下MMC卡的讀寫<b class='flag-5'>機制</b>

    一種通用SPI接口的FPGA設計與實現

    SPI 串行總線是一種常用的標準接口,其使用簡單方便而且占用系統資源少,應用相當廣泛。本文將介紹一種新的通用的SPI 總線的FPGA 實現方法。
    發表于 09-09 11:58 ?67次下載
    <b class='flag-5'>一種</b>通用<b class='flag-5'>SPI</b>接口的FPGA設計與實現

    一種改進的區塊鏈共識機制的研究與實現

    區塊鏈作為比特幣的底層技術,是一種通過去中心化、去信任的方式集體維護個可靠數據庫的技術方案。共識機制是區塊鏈的核心,解決了如何在個缺乏信任、完全自由開放的網絡中達成共識的問題。 文
    發表于 01-10 14:24 ?1次下載
    <b class='flag-5'>一種</b>改進的區塊鏈共識<b class='flag-5'>機制</b>的研究與實現

    可插拔組件設計機制SPI介紹

    SPI 的全稱是 Service Provider Interface, 即提供服務接口;是一種服務發現機制
    的頭像 發表于 03-23 09:20 ?1263次閱讀

    什么是SPI機制

    一種服務提供發現接口機制,旨在由第三方服務實現或擴展為組件,方便開發人員快速集成指定擴展組件滿足指定的需求。這
    的頭像 發表于 10-08 15:03 ?1316次閱讀
    什么是<b class='flag-5'>SPI</b><b class='flag-5'>機制</b>
    主站蜘蛛池模板: 亚洲色图另类小说 | 麻美ゆま夫の目の前で犯 | 久久免费看少妇高潮A片特爽 | 国产69精品9999XXXX | 色综合伊人色综合网站中国 | AV午夜午夜快憣免费观看 | 乌克兰女人与动ZOZO | 欧美肥胖女人bbwbbw视频 | 国产欧美在线亚洲一区刘亦菲 | 亚洲精品国产专区91在线 | 暖暖免费观看日本在线视频 | 男人天堂2018亚洲男人天堂 | 国产一区内射最近更新 | 草莓视频免费看 | 国拍在线精品视频免费观看 | 吃奶啃奶玩乳漫画 | 亚洲 日韩 自拍 视频一区 | 国产成人免费 | 亚洲色欲国产AV精品综合 | 人妻少妇69式99偷拍 | 亚洲精品国产在线网站 | 亚洲视频精选 | 色久久综合视频本道88 | 亚洲欧美国产双大乳头 | 国产欧美日韩综合精品一区二区 | 亚洲欧洲日产国码久在线 | 欧美高清videossexo | 又爽又黄又粗又大免费视频 | 国产真实女人一级毛片 | 亚洲视频中文字幕 | 甜性涩爱在线看 | 国产盗摄一区二区三区 | 中文人妻熟妇精品乱又伧 | 可以看的黄页的网站 | 欧美日韩国产码在线 | 女人麻豆国产香蕉久久精品 | 国产在线一区观看 | 亚洲中文无码永久免费 | 国产欧美日韩国产高清 | 噼里啪啦免费观看视频大全 | 野花高清在线观看免费3中文 |