Java基礎系列-SPI你認識嗎

  • 時間:2019-03-25 23:52 作者:唯一浩哥 來源:唯一浩哥 閱讀:98
  • 掃一掃,手機訪問
摘要:原創文章,轉載請標注出處:《Java基礎系列 SPI你認識嗎》一、SPI是什么SPI是相對API而言的。API指的是應用對服務調用方提供的接口,用于提供某種服務、功能,面向的是服務調用方。SPI指的是應用對服務實現方提供的接口,用于實現某種服務、功能,面向的是服務實現方二、SPI的使用2.1 第一步

原創文章,轉載請標注出處:《Java基礎系列-SPI你認識嗎》


一、SPI是什么

SPI是相對API而言的。

API指的是應用對服務調用方提供的接口,用于提供某種服務、功能,面向的是服務調用方。

SPI指的是應用對服務實現方提供的接口,用于實現某種服務、功能,面向的是服務實現方

二、SPI的使用

2.1 第一步:創立服務接口

package com.dh.spi;public interface Fruit {    String getName();}

2.2 第二步:創立多個服務實現

package com.dh.spi;public class Apple implements Fruit {    @Override    public String getName() {        return "apple";    }}
package com.dh.spi;public class Banana implements Fruit {    @Override    public String getName() {        return "Banana";    }}

這里的兩個服務實現類,針對的是兩個服務實現方,一方實現了Apple,另一方實現了Banana。

2.3 第三步:創立配置文件

在resource下創立/META-INF/services目錄,在services目錄下創立以服務接口全限定名為名稱的文件:com.dh.spi.Fruit

文件內容為,當前服務實現的服務實現者類的全限定名

com.dh.spi.Apple

2.4 第四步:創立測試類

public class Test {    public static void main(String[] args) {        ServiceLoader<Fruit> s = ServiceLoader.load(Fruit.class);        Iterator<Fruit> it = s.iterator();        while(it.hasNext())            System.out.println(it.next().getName());    }}

執行結果為:

apple

三、SPI的實現原理

SPI的實現主要依靠的就是ServiceLoader類。使用該類加載接口類型(例如:Fruit.class)

ServiceLoader<Fruit> s = ServiceLoader.load(Fruit.class);

盡管是一個load方法,但是并沒有加載到指定的服務實現類,這里僅僅是對加載服務實現類做少量準備工作:

  • 創立ServiceLoader
  • 為service賦值
  • 為loader賦值
  • 為acc賦值
  • 清空providers緩存
  • 為lookupIterator賦值,其實就是創立一個LazyIterator推遲迭代器。

而后創立迭代器:

Iterator<Fruit> it = s.iterator();

iterator方法中采用了匿名內部類的方式定義了一個新的迭代器,這個迭代器中每一個方法都是通過調用之前創立好的推遲迭代器lookupIterator來完成的

最后就是進行迭代加載了。

while(it.hasNext())    System.out.println(it.next().getName());

hasNext方法調用了推遲迭代器的hasNext方法,內部調用了hasNextService方法,在這個方法中就會設法去找到指定名稱(META-INF/services/+接口全限定名)的資源文件。并完成讀取文件內容的操作。

而后執行it.next()操作,這個又會調用推遲迭代器的對應方法hasNext,內部調用了nextService方法,這個方法主要功能就是加載上面從文件中讀取到的全限定名稱表示的類。并生成實例,將實例保存到providers中。

private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
  • 全部評論(0)
最新發布的資訊信息
【系統環境|】淘碼庫,據消息稱已被調查。淘碼庫源碼網,已經無法訪問!(2020-01-14 04:13)
【系統環境|服務器應用】Discuz隱藏后臺admin.php網址修改路徑(2019-12-16 16:48)
【系統環境|服務器應用】2020新網站如何讓百度快速收錄網站首頁最新方法,親測有用!免費(2019-12-16 16:46)
【系統環境|服務器應用】Discuz發布帖子時默認顯示第一個主題分類的修改方法(2019-12-09 00:13)
【系統環境|軟件環境】Android | App內存優化 之 內存泄漏 要點概述 以及 處理實戰(2019-12-04 14:27)
【系統環境|軟件環境】MySQL InnoDB 事務(2019-12-04 14:26)
【系統環境|軟件環境】vue-router(單頁面應用控制中心)常見用法(2019-12-04 14:26)
【系統環境|軟件環境】Linux中的Kill命令(2019-12-04 14:26)
【系統環境|軟件環境】Linux 入門時必學60個文件解決命令(2019-12-04 14:26)
【系統環境|軟件環境】更新版ThreeJS 3D粒子波浪動畫(2019-12-04 14:26)
手機二維碼手機訪問領取大禮包
返回頂部
2019白小姐旗袍图库