国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

詳解JAVA SPI機(jī)制和使用方法

瀏覽:5日期:2022-08-31 13:00:25

JAVA SPI 簡介

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

SPI 機(jī)制的約定

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

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

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

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

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

JDBC

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

COMMON-LOGGING

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

SPI 機(jī)制代碼示例

接口 People.java

package org.louis.spi.test;public interface People { public String speak();}

實(shí)現(xiàn)類 Chinese.java

package org.louis.spi.test; public class Chinese implements People{ public String speak() { return 'Chinese speak Chinese.'; } }

實(shí)現(xiàn)類 American.java

package org.louis.spi.test; public class American implements People{ public String speak() { return 'American speak English.'; } }

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

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

文件內(nèi)容:

org.louis.spi.test.Chineseorg.louis.spi.test.American

新建一個(gè)測試工程,引入以上代碼生成的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()); } } }

運(yùn)行結(jié)果:

Chinese speak Chinese.

American speak English.

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

以上就是示例講解JAVA SPI機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JAVA SPI機(jī)制的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产午夜精品理论片小yo奈 | 久久精彩视频 | 高清不卡一区二区三区 | 一级黄片毛片 | 国产三级网站 | 亚洲一区视频在线播放 | 18女人毛片大全 | 精品理论片一区二区三区 | 成人午夜免费在线观看 | 国产tv在线 | 亚洲综合成人网 | 欧美在线一区视频 | 二区视频在线 | 久久精品免看国产 | 亚洲欧美国产一区二区三区 | 亚洲精品国产精品精 | 国产亚洲欧美在线播放网站 | 亚洲一区网站 | 亚洲性网站 | 一级毛片在线免费观看 | 久草视频福利资源站 | 日本成人在线免费观看 | 毛片免费视频 | 福利视频在线午夜老司机 | hd欧美xxx欧美极品hd | 成年男女免费视频网站 | 亚洲精品美女在线观看播放 | 日韩男人的天堂 | 亚洲成人在线视频播放 | 成人国产一区 | 国产欧美日韩在线观看 | 一级做a爱过程免费视频时看 | 久草资源在线视频 | 国产黄色在线播放 | 特级aaaaaaaaa毛片免费视频 | 国产欧美日韩在线人成aaaa | 最近中文字幕精彩视频 | 俄罗斯美女在线观看一区 | 成人免费在线网站 | 国产亚洲精品久久久久久 | 宫女淫春3在线观 |