欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Spring?Boot?的SPI機(jī)制詳情

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

簡(jiǎn)介

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

Java SPI實(shí)現(xiàn)

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

示例說(shuō)明

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

public interface VedioSPI
{
    void call();
}

實(shí)現(xiàn)類(lèi)1

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

}

實(shí)現(xiàn)類(lèi)2

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

}

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

相關(guān)測(cè)試

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

說(shuō)明:Java實(shí)現(xiàn)spi是通過(guò)ServiceLoader來(lái)查找服務(wù)提供的工具類(lèi)。

運(yùn)行結(jié)果

圖片.png

源碼分析

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

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

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

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

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

針對(duì)java的spi存在的問(wèn)題,Spring的SPI機(jī)制沿用的SPI的思想,但對(duì)其進(jìn)行擴(kuò)展和優(yōu)化。

Spring SPI

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

Spring 示例

定義接口

public interface DataBaseSPI
{
   void getConnection();
}

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

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

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

}

1.在項(xiàng)目的META-INF目錄下,新增spring.factories文件

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

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

說(shuō)明多個(gè)實(shí)現(xiàn)采用逗號(hào)分隔。

相關(guān)測(cè)試類(lèi)

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實(shí)現(xiàn)SPI與java實(shí)現(xiàn)SPI非常相似,但是spring的spi方式針對(duì)java的spi進(jìn)行的相關(guān)優(yōu)化具體內(nèi)容如下:

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

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

源碼分析

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

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

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

說(shuō)明:實(shí)例化是通過(guò)反射來(lái)實(shí)現(xiàn)對(duì)應(yīng)的初始化。

總結(jié)

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

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

相關(guān)文章

  • Java Native關(guān)鍵字原理及作用解析

    Java Native關(guān)鍵字原理及作用解析

    這篇文章主要介紹了Java Native關(guān)鍵字原理及作用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Java如何在臨界區(qū)中避免競(jìng)態(tài)條件

    Java如何在臨界區(qū)中避免競(jìng)態(tài)條件

    這篇文章主要介紹了Java如何在臨界區(qū)中避免競(jìng)態(tài)條件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java操作excel表格詳解

    java操作excel表格詳解

    在日常工作中,對(duì)Excel工作表格的操作處理可是多的數(shù)不清楚,下面是java語(yǔ)言對(duì)其的操作,有需要的小伙伴可以參考下
    2021-10-10
  • Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢(xún)的操作方法

    Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢(xún)的操作方法

    這篇文章主要介紹了Mybatis Criteria的and和or進(jìn)行聯(lián)合條件查詢(xún)的方法,本文通過(guò)例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • MybatisPlus中@TableField注解的使用詳解

    MybatisPlus中@TableField注解的使用詳解

    這篇文章主要介紹了MybatisPlus中@TableField注解的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • maven多個(gè)倉(cāng)庫(kù)查詢(xún)的優(yōu)先級(jí)順序案例講解

    maven多個(gè)倉(cāng)庫(kù)查詢(xún)的優(yōu)先級(jí)順序案例講解

    這篇文章主要介紹了maven多個(gè)倉(cāng)庫(kù)查詢(xún)的優(yōu)先級(jí)順序,考慮到我們常用的配置文件是conf/settings.xml和工程里面的pom.xml文件,我們針對(duì)這兩個(gè)文件的結(jié)合來(lái)分析倉(cāng)庫(kù)的使用順序,需要的朋友可以參考下
    2023-04-04
  • Mybatis-Plus主鍵生成策略的方法

    Mybatis-Plus主鍵生成策略的方法

    本文主要介紹了Mybatis-Plus主鍵生成策略的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 詳解SpringBoot項(xiàng)目的創(chuàng)建與單元測(cè)試

    詳解SpringBoot項(xiàng)目的創(chuàng)建與單元測(cè)試

    這篇文章主要介紹了詳解SpringBoot項(xiàng)目的創(chuàng)建與單元測(cè)試,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-03-03
  • Java實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)截屏功能示例

    Java實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)截屏功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)截屏功能,涉及java網(wǎng)頁(yè)打開(kāi)及屏幕截圖功能相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Java?@SpringBootApplication注解深入解析

    Java?@SpringBootApplication注解深入解析

    這篇文章主要給大家介紹了關(guān)于Java?@SpringBootApplication注解的相關(guān)資料,@SpringBootApplication這個(gè)注解是Spring?Boot項(xiàng)目的基石,創(chuàng)建SpringBoot項(xiàng)目之后會(huì)默認(rèn)在主類(lèi)加上,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論