Java SPI機制和使用樣本

來源:互聯網
上載者:User

標籤:pre   實現   gen   使用   www.   必須   ext   建立   stat   

JAVA SPI 簡介

SPI 是 Java 提供的一種服務載入方式,全名為 Service Provider Interface。根據 Java 的 SPI 規範,我們可以定義一個服務介面,具體的實現由對應的實現者去提供,即服務提供者。然後在使用的時候再根據 SPI 的規範去擷取對應的服務提供者的服務實現。通過 SPI 服務載入機制進行服務的註冊和發現,可以有效避免在代碼中將服務提供者寫死。從而可以基於介面編程,實現模組間的解耦。

SPI 機制的約定

1 在 META-INF/services/ 目錄中建立以介面全限定名命名的檔案,該檔案內容為API具體實作類別的全限定名

2 使用 ServiceLoader 類動態載入 META-INF 中的實作類別

3 如 SPI 的實作類別為 Jar 則需要放在主程式 ClassPath 中

4 API 具體實作類別必須有一個不帶參數的構造方法

SPI 應用情境舉例 JDBC

jdbc4.0以前, 開發人員還需要基於Class.forName("xxx")的方式來裝載驅動,jdbc4也基於spi的機制來發現驅動供應商了,可以通過METAINF/services/java.sql.Driver檔案裡指定實作類別的方式來暴露驅動提供者.

COMMON-LOGGING

apache最早提供的日誌的門面介面。只有介面,沒有實現。具體方案由各供應商實現, 發現日誌供應商是通過掃描METAINF/services/org.apache.commons.logging.LogFactory設定檔,通過讀取該檔案的內容找到日誌提工商實作類別。只要我們的日誌實現裡包含了這個檔案,並在檔案裡制定 LogFactory工廠介面的實作類別即可。

SPI 機制程式碼範例

介面 People.java

package org.louis.spi.test;public interface People {
public String speak();
}

實作類別 Chinese.java

package org.louis.spi.test; public class Chinese implements People{    public String speak() {         return "Chinese speak Chinese.";     } }

實作類別 American.java

package org.louis.spi.test; public class American implements People{    public String speak() {         return "American speak English.";     } }

建立一個檔案,放置到 META-INF/Services 目錄:

檔案名稱:org.louis.spi.test.People

檔案內容:

org.louis.spi.test.Chineseorg.louis.spi.test.American

建立一個測試工程,引入以上代碼產生的Jar包

測試類別SpiTest.java

package org.louis.test; import java.util.Iterator;import java.util.ServiceLoader; import org.louis.spi.test.People;
import org.louis.spi.test.Chinese;
import org.louis.spi.test.American;
public class SpiTest { public static void main(String[] args) {
ServiceLoader<People> peoples = ServiceLoader.load(People.class);
Iterator<IOperation> iterator = peoples.iterator();
       while (iterator.hasNext()) { People people = iterator.next(); System.out.println(people.speak()); } } }

運行結果:

Chinese speak Chinese.

American speak English.

 

通過上面例子,我們看到,假如我要新加入一個韓國人的實現,那隻需要建立一個新的工程,建立一個Koeran類實現People介面,並在自己工程 META-INF/Services 目錄下放置一個設定檔指定Koeran實作類別,將工程打成Jar包,就完成了一個新的服務實現的開發。

西風小馬
出處:https://www.cnblogs.com/xifengxiaoma/ 
著作權,歡迎轉載,轉載請註明原文作者及出處。

 

Java SPI機制和使用樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.