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

Java SPI機(jī)制詳細(xì)介紹

 更新時(shí)間:2021年12月10日 10:59:19   作者:碼農(nóng)Amg  
大家好,本篇文章主要講的是Java SPI機(jī)制詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

為什么需要SPI?

思考一個(gè)場(chǎng)景,我們封裝了一套服務(wù),別人通過(guò)引入我們寫(xiě)好的包,就可以使用這些接口API,完成相應(yīng)的操作,這本來(lái)沒(méi)有什么問(wèn)題,但是會(huì)存在使用該服務(wù)的實(shí)體有不相同的業(yè)務(wù)需求,需要進(jìn)一步的擴(kuò)展,但是由于api是寫(xiě)好的,想要擴(kuò)展并非那么的簡(jiǎn)單,如果存在這樣子的場(chǎng)景,我們?cè)撛趺崔k?

可以使用Java 提供的SPI機(jī)制

什么是SPI?SPI和API的區(qū)別

SPI

SPI的全稱(chēng)是Service Provider Interface,是Java提供的可用于第三方實(shí)現(xiàn)和擴(kuò)展的機(jī)制,通過(guò)該機(jī)制,我們可以實(shí)現(xiàn)解耦,SPI接口方負(fù)責(zé)定義和提供默認(rèn)實(shí)現(xiàn),SPI調(diào)用方可以按需擴(kuò)展

API的全稱(chēng)是Application Programming Interface,廣義上來(lái)看就是接口,負(fù)責(zé)程序與程序之間進(jìn)行協(xié)作的通道,就好比上面給的例子,【我們封裝好了一套服務(wù),通過(guò)API的形式提供給他人使用,別人使用API就能得到想要的】

所以他們倆的區(qū)別就很明顯了,API的調(diào)用方只能依賴(lài)使用提供方的實(shí)現(xiàn),SPI就如同可定制化的API一樣,調(diào)用方可以自定義實(shí)現(xiàn)替換API提供的默認(rèn)實(shí)現(xiàn)

來(lái)人,上點(diǎn)對(duì)抗

首先,我們新建一個(gè)空的maven項(xiàng)目,里邊有兩個(gè)包

spi-provider從名字就可以得知是SPI的提供方

spi-user SPI的使用方

spi-provider

我們簡(jiǎn)單定義一個(gè)SPI接口,就叫ISpiTest,里邊就一個(gè)saySomething方法,再提供一個(gè)默認(rèn)的實(shí)現(xiàn)

public interface ISpiTest {
	void saySomething();
}

public class DefaultSpiImplementation implements ISpiTest{
	@Override
	public void saySomething() {
		System.out.println("[默認(rèn)實(shí)現(xiàn)] -> 今天也是充滿希望的一天");
	}
}

然后,模擬走流程,注意步驟4是我們之后要自定義替換的

/**
 * 模擬一套流程
 * @author Amg
 * @date 2021/12/9
 */
public class TestUtils {
	
	public static void workFlow(ISpiTest s) {
		
		System.out.println("1、步驟1.......");
		System.out.println("2、步驟2.......");
		System.out.println("3、步驟3.......");
		System.out.print("4、步驟4:");
		s.saySomething();
		System.out.println("5、步驟5.......");
	}
}

接著,重點(diǎn)來(lái)了,我們需要在resources目錄下面創(chuàng)建/META-INF/services文件夾,然后以SPI接口的全限定類(lèi)名作為名稱(chēng)創(chuàng)建一個(gè)文件

往文件里面填寫(xiě)實(shí)現(xiàn)類(lèi)的全限定類(lèi)名,如下

com.amg.spi.DefaultSpiImplementation

到此,spi-provider這個(gè)模塊就完成了,至于之后要怎么使用,到spi-user模塊中進(jìn)一步說(shuō)明

spi-user

首先,我們?cè)趐om文件中,引入spi-provider坐標(biāo)依賴(lài)

?然后定義main方法,在main方法中調(diào)用在spi-provider中定義的SPI接口,此時(shí)采用的是默認(rèn)的配置

可以注意到我們使用ServiceLoader這個(gè)類(lèi)的load方法,傳入SPI接口的字節(jié)碼進(jìn)行構(gòu)造,我們?cè)趕pi-provider中resources中給出了一個(gè)默認(rèn)實(shí)現(xiàn),但是我們是在spi-user中去調(diào)用的,ServiceLoader會(huì)自動(dòng)讀取META-INF下的配置文件,就算是跨jar包也是可以的

然后現(xiàn)在我們?cè)趕pi-user中定義一個(gè)實(shí)現(xiàn)類(lèi),以及把他配置到META-INF下(需要注意,這個(gè)配置的全限定類(lèi)名仍然需要是spi-provider中定義SPI接口的路徑),來(lái)看看效果

spi-user下META-INF里邊內(nèi)容如下

com.amg.spiuser.service.impl.WantHamburger

可以發(fā)現(xiàn),我們并沒(méi)有改變?nèi)魏蔚目蛻舳舜a,只是把配置文件進(jìn)行了簡(jiǎn)單的修改,即可完成自定義實(shí)現(xiàn),這就是使用SPI的魅力

??思考一下,我們之前的流程是怎么做的

首先定義了一個(gè)接口,面向接口編程嘛定義配置文件各個(gè)自定義的實(shí)現(xiàn)類(lèi),只需要按照規(guī)則重寫(xiě)配置文件即可

總結(jié)

通過(guò)這個(gè)流程,我們可以歸納為一句話,SPI是策略模式的一種體現(xiàn),配合面向接口編程的思想以及必要的配置文件,即可完成定義和具體實(shí)現(xiàn)的解耦,而且是可定制化的API

SPI的優(yōu)點(diǎn)有以下

定制化實(shí)現(xiàn)接口解耦

SPI的缺點(diǎn)有以下

通過(guò)觀察ServiceLoader,可以發(fā)現(xiàn)并沒(méi)有額外的加鎖機(jī)制,所以會(huì)存在并發(fā)問(wèn)題獲取對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)不夠靈活,從上面例子可以看出,需要使用迭代器的方式獲取需要知道接口的所有具體實(shí)現(xiàn)類(lèi),所以每次都要加載和實(shí)例化所有的實(shí)現(xiàn)類(lèi)

實(shí)際中,SPI的使用還是很常見(jiàn)的,例如Dubbo和Spring Boot都為我們提供了一套SPI機(jī)制,只不過(guò)此SPI是在Java提供的SPI機(jī)制基礎(chǔ)上進(jìn)行改造而來(lái),有興趣的同學(xué)也可以去查下資料,增長(zhǎng)增長(zhǎng)

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

  • Spring boot Mybatis 整合(完整版)

    Spring boot Mybatis 整合(完整版)

    本文是一篇比較完整的版本通過(guò)圖文并茂的形式給大家介紹了Spring boot Mybatis 整合過(guò)程,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-09-09
  • SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署

    SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署

    spring-boot-devtools是一個(gè)為開(kāi)發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。,這篇文章主要介紹了SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署,感興趣的小伙伴們可以參考一下
    2018-07-07
  • SpringBoot集成Sharding Jdbc使用復(fù)合分片的實(shí)踐

    SpringBoot集成Sharding Jdbc使用復(fù)合分片的實(shí)踐

    數(shù)據(jù)庫(kù)分庫(kù)分表中間件是采用的 apache sharding。本文主要介紹了SpringBoot集成Sharding Jdbc使用復(fù)合分片的實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-09-09
  • springMVC導(dǎo)出word模板的方法

    springMVC導(dǎo)出word模板的方法

    這篇文章主要為大家詳細(xì)介紹了springMVC導(dǎo)出word模板的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式總結(jié)

    Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)HTTP請(qǐng)求的4種方式,在java開(kāi)發(fā)中,經(jīng)常遇到需要調(diào)用第三方提供的接口服務(wù)的需求,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08
  • Spring Boot 2.4配置特定環(huán)境時(shí)spring: profiles提示被棄用的原因分析

    Spring Boot 2.4配置特定環(huán)境時(shí)spring: profiles提示被棄用的原

    這篇文章主要介紹了Spring Boot 2.4配置特定環(huán)境時(shí)spring: profiles提示被棄用的原因,本文給大家分享詳細(xì)解決方案,需要的朋友可以參考下
    2023-04-04
  • Spring Bean的生命周期詳細(xì)介紹

    Spring Bean的生命周期詳細(xì)介紹

    這篇文章主要介紹了Spring Bean的生命周期的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    SpringBoot多級(jí)緩存實(shí)現(xiàn)方案總結(jié)

    所謂多級(jí)緩存,是指在整個(gè)系統(tǒng)架構(gòu)的不同系統(tǒng)層面進(jìn)行數(shù)據(jù)緩存,以提升訪問(wèn)速度,多級(jí)緩存就是為了解決項(xiàng)目服務(wù)中單一緩存使用不足的缺點(diǎn),本文我們將給大家總結(jié)了SpringBoot多級(jí)緩存實(shí)現(xiàn)方案,需要的朋友可以參考下
    2023-08-08
  • SpringBoot實(shí)現(xiàn)接口文檔自動(dòng)生成的方法示例

    SpringBoot實(shí)現(xiàn)接口文檔自動(dòng)生成的方法示例

    在開(kāi)發(fā)Web應(yīng)用程序時(shí),接口文檔是非常重要的一環(huán),本文主要介紹了SpringBoot實(shí)現(xiàn)接口文檔自動(dòng)生成的方法示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • 最新評(píng)論