概述
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與實戰》