最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Spring?Boot?的SPI機制詳情

 更新時間:2022年08月18日 08:55:44   作者:劍圣無痕  
這篇文章主要介紹了深入解析Spring?Boot的SPI機制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機制,可以用來啟用框架擴展和替換組件,主要用于框架中開發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容

簡介

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

Java SPI實現(xiàn)

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

示例說明

創(chuàng)建動態(tài)接口

public interface VedioSPI
{
    void call();
}

實現(xiàn)類1

public class Mp3Vedio implements VedioSPI
{
    @Override
    public void call()
    {
        System.out.println("this is mp3 call");
    }

}

實現(xiàn)類2

public class Mp4Vedio implements VedioSPI
{
    @Override
    public void call()
    {
       System.out.println("this is mp4 call");
    }

}

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

相關(guān)測試

public class VedioSPITest
{
    public static void main(String[] args)
    {
        ServiceLoader<VedioSPI> serviceLoader =ServiceLoader.load(VedioSPI.class);
        
        serviceLoader.forEach(t->{
            t.call();
        });
    }
}

說明:Java實現(xiàn)spi是通過ServiceLoader來查找服務(wù)提供的工具類。

運行結(jié)果

圖片.png

源碼分析

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

從源碼可以發(fā)現(xiàn):

  • ServiceLoader類本身實現(xiàn)了Iterable接口并實現(xiàn)了其中的iterator方法,iterator方法的實現(xiàn)中調(diào)用了LazyIterator這個內(nèi)部類中的方法,解析完服務(wù)提供接口文件后最終結(jié)果放在了Iterator中返回,并不支持服務(wù)提供接口實現(xiàn)類的直接訪問。
  • 所有服務(wù)提供接口的對應(yīng)文件都是放置在META-INF/services/目錄下,final類型決定了PREFIX目錄不可變更。

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

  • Java內(nèi)置的方法方式只能通過遍歷來獲取
  • 服務(wù)提供接口必須放到META-INF/services/目錄下。

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

Spring SPI

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

Spring 示例

定義接口

public interface DataBaseSPI
{
   void getConnection();
}

相關(guān)實現(xiàn)

#DB2實現(xiàn)
public class DB2DataBase implements DataBaseSPI
{
    @Override
    public void getConnection()
    {
        System.out.println("this database is db2");
    }

}
#Mysql實現(xiàn)
public class MysqlDataBase implements DataBaseSPI
{
    @Override
    public void getConnection()
    {
       System.out.println("this is mysql database");
    }

}

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

2.填寫相關(guān)的接口信息,內(nèi)容如下:

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

說明多個實現(xiàn)采用逗號分隔。

相關(guān)測試類

public class SpringSPITest
{
    public static void main(String[] args)
    {
         List<DataBaseSPI> dataBaseSPIs =SpringFactoriesLoader.loadFactories(DataBaseSPI.class, 
                 Thread.currentThread().getContextClassLoader());
         
         for(DataBaseSPI datBaseSPI:dataBaseSPIs){
            datBaseSPI.getConnection();
         }
    }
}

輸出結(jié)果

從示例中我們看出,Spring 采用spring.factories實現(xiàn)SPI與java實現(xiàn)SPI非常相似,但是spring的spi方式針對java的spi進行的相關(guān)優(yōu)化具體內(nèi)容如下:

  • Java SPI是一個服務(wù)提供接口對應(yīng)一個配置文件,配置文件中存放當前接口的所有實現(xiàn)類,多個服務(wù)提供接口對應(yīng)多個配置文件,所有配置都在services目錄下;
  • Spring factories SPI是一個spring.factories配置文件存放多個接口及對應(yīng)的實現(xiàn)類,以接口全限定名作為key,實現(xiàn)類作為value來配置,多個實現(xiàn)類用逗號隔開,僅spring.factories一個配置文件。

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

源碼分析

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

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

其相關(guān)源碼如下:

說明:實例化是通過反射來實現(xiàn)對應(yīng)的初始化。

總結(jié)

本文詳細的講解了java和Spring的SPI機制,SPI技術(shù)將服務(wù)接口與服務(wù)實現(xiàn)進行分離實現(xiàn)解耦,從而提升程序的可擴展性。如有疑問,請隨時反饋。

到此這篇關(guān)于深入解析Spring Boot 的SPI機制詳情的文章就介紹到這了,更多相關(guān)Spring Boot SPI機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java實現(xiàn)緩存(LRU,FIFO)

    詳解Java實現(xiàn)緩存(LRU,FIFO)

    本篇文章主要介紹了詳解Java實現(xiàn)緩存(LRU,FIFO) ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 詳解spring mvc中url-pattern的寫法

    詳解spring mvc中url-pattern的寫法

    這篇文章主要介紹了spring mvc中url-pattern的寫法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • SpringBoot定時任務(wù)調(diào)度與爬蟲的配置實現(xiàn)

    SpringBoot定時任務(wù)調(diào)度與爬蟲的配置實現(xiàn)

    這篇文章主要介紹了SpringBoot定時任務(wù)調(diào)度與爬蟲的實現(xiàn),使用webmagic開發(fā)爬蟲,繼承PageProcessor接口編寫自己的處理類,process是定制爬蟲邏輯的核心接口,在這里編寫抽取邏輯,具體實現(xiàn)配置過程跟隨小編一起看看吧
    2022-01-01
  • Java?精煉解讀時間復(fù)雜度與空間復(fù)雜度

    Java?精煉解讀時間復(fù)雜度與空間復(fù)雜度

    對于一個算法,其時間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當追求一個較好的時間復(fù)雜度時,可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于Java時間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Spring Security實現(xiàn)多次登錄失敗后賬戶鎖定功能

    Spring Security實現(xiàn)多次登錄失敗后賬戶鎖定功能

    當用戶多次登錄失敗的時候,我們應(yīng)該將賬戶鎖定,等待一定的時間之后才能再次進行登錄操作。今天小編給大家分享Spring Security實現(xiàn)多次登錄失敗后賬戶鎖定功能,感興趣的朋友一起看看吧
    2019-11-11
  • Spring在代碼中獲取bean的方法小結(jié)

    Spring在代碼中獲取bean的方法小結(jié)

    在工作中有時候我們需要在非spring依賴注入或管理的類中獲取service、dao等bean對象,這時候用@Autowired和@Resource顯然是不行的,那么下面這篇文章就給大家了整理幾種獲取bean的方式,對大家的學(xué)習和工作具有一定的參考借鑒,下面來一起看看吧。
    2016-11-11
  • Java計算Date類時間差實例代碼演示

    Java計算Date類時間差實例代碼演示

    最近工作中遇到需要計算時間差,這里給大家總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于Java計算Date類時間差的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • java?Map.Entry的使用示例

    java?Map.Entry的使用示例

    Map.Entry是Java中Map接口的嵌套接口,它提供了獲取鍵和值的方法及遍歷和操作Map的鍵值對,本文就來詳細的介紹一下,感興趣的可以了解一下
    2024-11-11
  • 二叉排序樹的實現(xiàn)與基本操作

    二叉排序樹的實現(xiàn)與基本操作

    二叉排序樹又稱二叉查找樹。本文主要對二叉排序樹的實現(xiàn)與基本操作進行詳細介紹,以下代碼實現(xiàn)了:1、二叉樹的構(gòu)建;2、二叉樹的中、前、后、層序遍歷;3、二叉樹中結(jié)點的最大距離。下面就跟著小編一起來看下吧
    2016-12-12
  • Mybatis執(zhí)行多條語句/批量更新方式

    Mybatis執(zhí)行多條語句/批量更新方式

    這篇文章主要介紹了Mybatis執(zhí)行多條語句/批量更新方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論

邛崃市| 巴林右旗| 喀喇沁旗| 平顶山市| 琼结县| 宁夏| 凌云县| 长丰县| 浏阳市| 怀安县| 兰坪| 安图县| 绍兴市| 寿光市| 长兴县| 临泉县| 津市市| 平邑县| 邻水| 安龙县| 台北县| 九寨沟县| 沂南县| 柳州市| 兴隆县| 许昌县| 石屏县| 博乐市| 班玛县| 英山县| 普定县| 岐山县| 金乡县| 永州市| 铁力市| 石阡县| 博乐市| 拜城县| 长兴县| 中牟县| 黔江区|