詳解JAVASPI機制以及使用方法

小編這次要給大家分享的是詳解JAVA SPI機制以及使用方法,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

成都創(chuàng)新互聯(lián)公司是一家以網(wǎng)站建設(shè)公司、網(wǎng)頁設(shè)計、品牌設(shè)計、軟件運維、seo優(yōu)化排名、小程序App開發(fā)等移動開發(fā)為一體互聯(lián)網(wǎng)公司。已累計為成都房屋鑒定等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開發(fā)服務(wù)。

JAVA SPI 簡介

SPI 是 Java 提供的一種服務(wù)加載方式,全名為 Service Provider Interface。根據(jù) Java 的 SPI 規(guī)范,我們可以定義一個服務(wù)接口,具體的實現(xiàn)由對應(yīng)的實現(xiàn)者去提供,即服務(wù)提供者。然后在使用的時候再根據(jù) SPI 的規(guī)范去獲取對應(yīng)的服務(wù)提供者的服務(wù)實現(xiàn)。通過 SPI 服務(wù)加載機制進行服務(wù)的注冊和發(fā)現(xiàn),可以有效的避免在代碼中將具體的服務(wù)提供者寫死。從而可以基于接口編程,實現(xiàn)模塊間的解耦。

SPI 機制的約定

1 在 META-INF/services/ 目錄中創(chuàng)建以接口全限定名命名的文件,該文件內(nèi)容為API具體實現(xiàn)類的全限定名

2 使用 ServiceLoader 類動態(tài)加載 META-INF 中的實現(xiàn)類

3 如 SPI 的實現(xiàn)類為 Jar 則需要放在主程序 ClassPath 中

4 API 具體實現(xiàn)類必須有一個不帶參數(shù)的構(gòu)造方法

SPI 應(yīng)用場景舉例

JDBC

jdbc4.0以前, 開發(fā)人員還需要基于Class.forName("xxx")的方式來裝載驅(qū)動,jdbc4也基于spi的機制來發(fā)現(xiàn)驅(qū)動提供商了,可以通過METAINF/services/java.sql.Driver文件里指定實現(xiàn)類的方式來暴露驅(qū)動提供者.

COMMON-LOGGING

apache最早提供的日志的門面接口。只有接口,沒有實現(xiàn)。具體方案由各提供商實現(xiàn), 發(fā)現(xiàn)日志提供商是通過掃描METAINF/services/org.apache.commons.logging.LogFactory配置文件,通過讀取該文件的內(nèi)容找到日志提工商實現(xiàn)類。只要我們的日志實現(xiàn)里包含了這個文件,并在文件里制定 LogFactory工廠接口的實現(xiàn)類即可。

SPI 機制代碼示例

接口 People.java

package org.louis.spi.test;

public interface People {

  public String speak();

}

實現(xiàn)類 Chinese.java

package org.louis.spi.test;
 
public class Chinese implements People{

 public String speak() {
 
  return "Chinese speak Chinese.";
 
 }
 
}

實現(xiàn)類 American.java

package org.louis.spi.test;
 
public class American implements People{

 public String speak() {
 
  return "American speak English.";
 
 }
 
}

創(chuàng)建一個文件,放置到 META-INF/Services 目錄:

文件名:org.louis.spi.test.People

文件內(nèi)容:

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());
 
  }
 } 
}

運行結(jié)果:

Chinese speak Chinese.

American speak English.

通過上面例子,我們看到,假如我要新加入一個韓國人的實現(xiàn),那只需要新建一個新的工程,創(chuàng)建一個Koeran類實現(xiàn)People接口,并在自己工程 META-INF/Services 目錄下放置一個配置文件指定Koeran實現(xiàn)類,將工程打成Jar包,就完成了一個新的服務(wù)實現(xiàn)的開發(fā)。

看完這篇關(guān)于詳解JAVA SPI機制以及使用方法的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。

標題名稱:詳解JAVASPI機制以及使用方法
當前鏈接:http://m.kartarina.com/article8/ppheip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站關(guān)鍵詞優(yōu)化App設(shè)計網(wǎng)站內(nèi)鏈搜索引擎優(yōu)化網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)
主站蜘蛛池模板: 无码免费午夜福利片在线| 日韩国产精品无码一区二区三区| 无码夫の前で人妻を侵犯| 国产成人无码一区二区在线播放| 亚洲看片无码在线视频| 国产成人无码A区在线观看导航| 红桃AV一区二区三区在线无码AV| 少妇人妻无码精品视频app| 亚洲成a人无码亚洲成www牛牛| 国产亚洲精品a在线无码| 92午夜少妇极品福利无码电影| 超清无码无卡中文字幕| 亚洲av无码无线在线观看| 亚洲一区AV无码少妇电影☆| 精品久久久久久无码人妻| 人妻无码久久一区二区三区免费| 国产日韩精品无码区免费专区国产| 日韩精品无码久久久久久| 久久av高潮av无码av喷吹| 好了av第四综合无码久久| 色噜噜综合亚洲av中文无码 | 亚洲精品无码成人片在线观看| 熟妇人妻无码中文字幕| 国产成人AV一区二区三区无码| 日韩无码系列综合区| 高清无码中文字幕在线观看视频| 无码专区久久综合久中文字幕| 成年无码av片在线| 午夜寂寞视频无码专区| 一本色道久久综合无码人妻 | 亚洲AV无码一区二区三区牲色 | 波多野结衣VA无码中文字幕电影 | 制服在线无码专区| 亚洲国产精品成人精品无码区 | 免费A级毛片无码A| WWW久久无码天堂MV| 国产精品无码免费播放| 日日摸日日碰人妻无码 | 亚洲A∨无码无在线观看| 中文人妻无码一区二区三区| 色综合热无码热国产|