Java SPI機制簡述

概述

SPI全稱Service Provider Interface,是一種為框架提供良好擴展性的機制。一般由框架開發方定義接口規範(如java.sql.Driver),而第三方廠商為之提供自己的實現(如com.mysql.jdbc.Driver)。藉助SPI機制可以達到不修改框架具體實現代碼就能根據依賴自動切換具體實現方案(實現類)的效果。

使用

Java SPI使用了策略模式,一個接口多種實現,這一點從概述中我們已經能夠體會的到。

框架接口定義

定義一個接口及對應的方法

public interface PrintService{
    void printInfo();
}

第三方廠商提供實現

編寫該接口的一個實現類,各廠商提供各自的實現

public class PrintServiceImpl implements PrintService{
    @Override
    public void printInfo(){
        System.out.println("hello world");
    }
}

第三方廠商創建配置文件

各第三方實現包(項目)需要在resources/META-INF/services目錄下,創建一個以接口全路徑命名的文件,如com.test.spi.PrintService。用於框架尋找實現類位置
內容為具體實現類的全路徑名,如果有多個,則用分隔符分割。

com.third.spi.PrintServiceImpl

框架中調用SPI的具體實現

SPI的具體實現的調用通過java.util.ServiceLoader來加載具體的實現類。

 public static void main(String[] args{
    ServiceLoader<PrintService>printLoader=ServiceLoader.load(PrintService.class);
    for (PrintService pintService : printerLoader) {            
        pintService.printInfo();       
    }    
}

總結

通過以上使用,我們可以看出,只有更改不同的第三方廠商提供的依賴包,從而我們的框架會通過ServiceLoader調用同的實現類,從而達到了只修改依賴就變更了具體實現方案的良好擴展效果。

參考資料

《深入理解Apache Dubbo與實戰》