作者:sigangjun
blog.csdn.net/sigangjun/article/details/79071850
SPI的全名為:Service Provider Interface,大多數開發人員可能不熟悉,因為這個是針對廠商或者插件的,在java.util.ServiceLoader的檔案里有比較詳細的介紹,
簡單的總結下 Java SPI 機制的思想,我們系統里抽象的各個模塊,往往有很多不同的實作方案,比如日志模塊的方案,xml決議模塊、jdbc模塊的方案等,面向的物件的設計里,我們一般推薦模塊之間基于介面編程,模塊之間不對實作類進行硬編碼,
一旦代碼里涉及具體的實作類,就違反了可拔插的原則,如果需要替換一種實作,就需要修改代碼,為了實作在模塊裝配的時候能不在程式里動態指明,這就需要一種服務發現機制,
Java SPI 就是提供這樣的一個機制:為某個介面尋找服務實作的機制,有點類似IOC的思想,就是將裝配的控制權移到程式之外,在模塊化設計中這個機制尤其重要,
Java SPI 的具體約定為:當服務的提供者,提供了服務介面的一種實作之后,在jar包的META-INF/services/目錄里同時創建一個以服務介面命名的檔案,該檔案里就是實作該服務介面的具體實作類,
而當外部程式裝配這個模塊的時候,就能通過該jar包META-INF/services/里的組態檔找到具體的實作類名,并裝載實體化,完成模塊的注入,
基于這樣一個約定就能很好的找到服務介面的實作類,而不需要再代碼里制定,jdk提供服務實作查找的一個工具類:java.util.ServiceLoader,
1.common-logging
apache最早提供的日志的門面介面,只有介面,沒有實作,具體方案由各提供商實作, 發現日志提供商是通過掃描 META-INF/services/org.apache.commons.logging.LogFactory組態檔,通過讀取該檔案的內容找到日志提工商實作類,
只要我們的日志實作里包含了這個檔案,并在檔案里制定 LogFactory工廠介面的實作類即可,關注Java技術堆疊微信公眾號,在后臺回復關鍵字:Java,可以獲取更多堆疊長整理的Java技術干貨,
2.jdbc
jdbc4.0以前, 開發人員還需要基于Class.forName("xxx")的方式來裝載驅動,jdbc4也基于spi的機制來發現驅動提供商了,可以通過META-INF/services/java.sql.Driver檔案里指定實作類的方式來暴露驅動提供者,
一個內容管理系統有一個搜索模塊,是基于介面編程的,搜索的實作可能是基于檔案系統的搜索,也可能是基于資料庫的搜索
介面定義如下:
package my.xyz.spi;
import java.util.List;
public interface Search {
public List serch(String keyword);
}
A公司采用檔案系統搜索的方式實作了 Search介面,B公司采用了資料庫系統的方式實作了Search介面,
-
A公司實作的類:com.A.spi.impl.FileSearch
-
B公司實作的類:com.B.spi.impl.DatabaseSearch
那么A公司發布 實作jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search檔案中寫下如下內容:
com.A.spi.impl.FileSearch
那么B公司發布 實作jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search檔案中寫下如下內容:
com.B.spi.impl.DatabaseSearch
下面是 SPI 測驗代碼:
package com.xyz.factory;
import java.util.Iterator;
import java.util.ServiceLoader;
import my.xyz.spi.Search;
public class SearchFactory {
private SearchFactory() {
}
public static Search newSearch() {
Search search = null;
ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
Iterator<Search> searchs = serviceLoader.iterator();
if (searchs.hasNext()) {
search = searchs.next();
}
return search;
}
}
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167449.html
標籤:Java
