java的spi機(jī)制

SPI機(jī)制

Java SPI思想梳理
1.看了一些spi機(jī)制相關(guān)的文章,嘗試寫出自己的理解,不正確的地方歡迎指出。
java的spi機(jī)制,相對(duì)于api機(jī)制;

  • api機(jī)制:模塊之間依賴接口而不依賴具體的實(shí)現(xiàn),具體的實(shí)現(xiàn)類的修改不影響接口的使用。而調(diào)用方不需要關(guān)心接口的具體實(shí)現(xiàn)是什么,只需要知道自己需要什么能力即可。
  • spi機(jī)制:提供方制定了接口,并事先準(zhǔn)備好多套實(shí)現(xiàn);使用方來決定使用哪種實(shí)現(xiàn)。

2 SPI具體約定
java spi的具體約定為:當(dāng)服務(wù)的提供者,提供了服務(wù)接口的一種實(shí)現(xiàn)之后,在jar包的META-INF/services/目錄里同時(shí)創(chuàng)建一個(gè)以服務(wù)接口命名的文件。該文件里就是實(shí)現(xiàn)該服務(wù)接口的具體實(shí)現(xiàn)類。而當(dāng)外部程序裝配這個(gè)模塊的時(shí)候,就能通過該jar包META-INF/services/里的配置文件找到具體的實(shí)現(xiàn)類名,并裝載實(shí)例化,完成模塊的注入。 基于這樣一個(gè)約定就能很好的找到服務(wù)接口的實(shí)現(xiàn)類,而不需要再代碼里制定。jdk提供服務(wù)實(shí)現(xiàn)查找的一個(gè)工具類:java.util.ServiceLoader

java.util.ServiceLoader使用
Java.util.ServiceLoader這個(gè)類來從配置文件中加載子類或者接口的實(shí)現(xiàn)類。以前從來沒有使用過這個(gè)類,進(jìn)去大概看了一下具體的實(shí)現(xiàn)。主要是從META-INF/services這個(gè)目錄下的配置文件加載給定接口或者基類的實(shí)現(xiàn),ServiceLoader會(huì)根據(jù)給定的類的full name來在META-INF/services下面找對(duì)應(yīng)的文件,在這個(gè)文件中定義了所有這個(gè)類的子類或者接口的實(shí)現(xiàn)類,返回一個(gè)實(shí)例。

首先定義接口
public interface Search {

   public List<String> search(String keysord);
}

兩個(gè)實(shí)現(xiàn)類
public class DocSearch implements Search {

   @Override
   public List<String> search(String keysord) {
       System.out.println("dearch in doc");
       return null;
   }
}

public class DbSearch implements Search {

   @Override
   public List<String> search(String keysord) {
       System.out.println("db search");
       return null;
   }
}

然后 在META-INF/services目錄下新建文件:
spi.Search
文件內(nèi)容為:實(shí)現(xiàn)類的全路徑
#寫上Search接口的實(shí)現(xiàn)類,這樣就可以知道調(diào)用哪個(gè)實(shí)現(xiàn)類了
spi.DocSearch
spi.DbSearch

測試一下:
public class Test {
       public static void main(String[] args) {
           //加載到spi.Search文件下面配置的實(shí)現(xiàn)類
           ServiceLoader<Search> s = ServiceLoader.load(Search.class);
           Iterator<Search> iterator = s.iterator();
           while (iterator.hasNext()) {
               System.out.println("#");
               Search search =  iterator.next();
               search.search("hello world");
           }
       }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 什么是SPI SPI全稱Service Provider Interface,是Java提供的一種接口擴(kuò)展機(jī)制。通...
    bdqfork閱讀 380評(píng)論 0 1
  • SPI是什么 SPI的英文名稱是Service Provider Interface,是Java 內(nèi)置的服務(wù)發(fā)現(xiàn)機(jī)...
    GallenZhang閱讀 394評(píng)論 0 0
  • 最近在閱讀Dubbo框架源代碼時(shí),經(jīng)??吹紷Spi,查了一下SPI: Service Provider Inter...
    kobe0429閱讀 401評(píng)論 0 0
  • SPI的概念 英文全稱為Service Provider Interface 是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制 ...
    孫先森不可不弘毅閱讀 304評(píng)論 0 0
  • 當(dāng)服務(wù)的提供者,提供了服務(wù)接口的一種實(shí)現(xiàn)之后,在jar包的META-INF/services/目錄里同時(shí)創(chuàng)建一個(gè)以...
    男人三餅閱讀 313評(píng)論 0 2

友情鏈接更多精彩內(nèi)容