您好,登錄后才能下訂單哦!
小編這次要給大家分享的是詳解JAVA SPI機制以及使用方法,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
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.Chinese org.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包,就完成了一個新的服務實現的開發。
看完這篇關于詳解JAVA SPI機制以及使用方法的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。