java中的SPI機(jī)制

<main>

<article>

1 SPI機(jī)制簡介

SPI的全名為Service Provider Interface.大多數(shù)開發(fā)人員可能不熟悉羞秤,因?yàn)檫@個(gè)是針對廠商或者插件的玖喘。在java.util.ServiceLoader的文檔里有比較詳細(xì)的介紹。簡單的總結(jié)下java spi機(jī)制的思想。我們系統(tǒng)里抽象的各個(gè)模塊,往往有很多不同的實(shí)現(xiàn)方案,比如日志模塊的方案红伦,xml解析模塊、jdbc模塊的方案等淀衣。面向的對象的設(shè)計(jì)里昙读,我們一般推薦模塊之間基于接口編程,模塊之間不對實(shí)現(xiàn)類進(jìn)行硬編碼膨桥。一旦代碼里涉及具體的實(shí)現(xiàn)類蛮浑,就違反了可拔插的原則,如果需要替換一種實(shí)現(xiàn)国撵,就需要修改代碼陵吸。為了實(shí)現(xiàn)在模塊裝配的時(shí)候能不在程序里動(dòng)態(tài)指明,這就需要一種服務(wù)發(fā)現(xiàn)機(jī)制介牙。 java spi就是提供這樣的一個(gè)機(jī)制:為某個(gè)接口尋找服務(wù)實(shí)現(xiàn)的機(jī)制壮虫。有點(diǎn)類似IOC的思想,就是將裝配的控制權(quán)移到程序之外环础,在模塊化設(shè)計(jì)中這個(gè)機(jī)制尤其重要囚似。

2 SPI具體約定

java spi的具體約定為:當(dāng)服務(wù)的提供者,提供了服務(wù)接口的一種實(shí)現(xiàn)之后线得,在jar包的META-INF/services/目錄里同時(shí)創(chuàng)建一個(gè)以服務(wù)接口命名的文件饶唤。該文件里就是實(shí)現(xiàn)該服務(wù)接口的具體實(shí)現(xiàn)類。而當(dāng)外部程序裝配這個(gè)模塊的時(shí)候贯钩,就能通過該jar包META-INF/services/里的配置文件找到具體的實(shí)現(xiàn)類名募狂,并裝載實(shí)例化办素,完成模塊的注入。 基于這樣一個(gè)約定就能很好的找到服務(wù)接口的實(shí)現(xiàn)類祸穷,而不需要再代碼里制定性穿。jdk提供服務(wù)實(shí)現(xiàn)查找的一個(gè)工具類:java.util.ServiceLoader

3 應(yīng)用場景

1.common-logging apache最早提供的日志的門面接口。只有接口雷滚,沒有實(shí)現(xiàn)需曾。具體方案由各提供商實(shí)現(xiàn), 發(fā)現(xiàn)日志提供商是通過掃描 META-INF/services/org.apache.commons.logging.LogFactory配置文件祈远,通過讀取該文件的內(nèi)容找到日志提工商實(shí)現(xiàn)類呆万。只要我們的日志實(shí)現(xiàn)里包含了這個(gè)文件,并在文件里制定 LogFactory工廠接口的實(shí)現(xiàn)類即可车份。
2.jdbc jdbc4.0以前谋减, 開發(fā)人員還需要基于Class.forName("xxx")的方式來裝載驅(qū)動(dòng),jdbc4也基于spi的機(jī)制來發(fā)現(xiàn)驅(qū)動(dòng)提供商了躬充,可以通過META-INF/services/java.sql.Driver文件里指定實(shí)現(xiàn)類的方式來暴露驅(qū)動(dòng)提供者.

4 案例說明

一個(gè)內(nèi)容管理系統(tǒng)有一個(gè)搜索模塊逃顶。是基于接口編程的。搜索的實(shí)現(xiàn)可能是基于文件系統(tǒng)的搜索充甚,也可能是基于數(shù)據(jù)庫的搜索

接口定義如

[java] view plain copy print?

package my.xyz.spi;  
import java.util.List;  
public interface Search {  
   public List serch(String keyword);  
}

A公司采用文件系統(tǒng)搜索的方式實(shí)現(xiàn)了 Search接口,B公司采用了數(shù)據(jù)庫系統(tǒng)的方式實(shí)現(xiàn)了Search接口
A公司實(shí)現(xiàn)的類 com.A.spi.impl.FileSearch
B公司實(shí)現(xiàn)的類 com.B.spi.impl.DatabaseSearch

那么A公司發(fā)布 實(shí)現(xiàn)jar包時(shí)霸褒,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內(nèi)容

com.A.spi.impl.FileSearch

那么B公司發(fā)布 實(shí)現(xiàn)jar包時(shí)伴找,則要在jar包中META-INF/services/my.xyz.spi.Search文件中寫下如下內(nèi)容

com.B.spi.impl.DatabaseSearch

[java] view plain copy print?

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.  package my.xyz.test;    
2.  import java.util.Iterator;    
3.  import java.util.ServiceLoader;    
4.  import com.xyz.factory.SearchFactory;    
5.  import my.xyz.spi.Search;    
6.  public class SearchTest {    
7.    public static void main(String[] args) {    
8.         Search search = SearchFactory.newSearch();    
9.         search.serch("java spi test");    
10.   }    
11.  }    

參考原文https://blog.csdn.net/sigangjun/article/details/79071850

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市废菱,隨后出現(xiàn)的幾起案子技矮,更是在濱河造成了極大的恐慌,老刑警劉巖殊轴,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衰倦,死亡現(xiàn)場離奇詭異,居然都是意外死亡旁理,警方通過查閱死者的電腦和手機(jī)樊零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孽文,“玉大人驻襟,你說我怎么就攤上這事∮罂蓿” “怎么了沉衣?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長减牺。 經(jīng)常有香客問我豌习,道長存谎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任肥隆,我火速辦了婚禮愕贡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷屿。我一直安慰自己固以,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布嘱巾。 她就那樣靜靜地躺著憨琳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旬昭。 梳的紋絲不亂的頭發(fā)上篙螟,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音问拘,去河邊找鬼遍略。 笑死,一個(gè)胖子當(dāng)著我的面吹牛骤坐,可吹牛的內(nèi)容都是我干的绪杏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纽绍,長吁一口氣:“原來是場噩夢啊……” “哼蕾久!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拌夏,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤僧著,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后障簿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盹愚,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年站故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了皆怕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡世蔗,死狀恐怖端逼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情污淋,我是刑警寧澤顶滩,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站寸爆,受9級特大地震影響礁鲁,放射性物質(zhì)發(fā)生泄漏盐欺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一仅醇、第九天 我趴在偏房一處隱蔽的房頂上張望冗美。 院中可真熱鬧,春花似錦析二、人聲如沸粉洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽属韧。三九已至,卻和暖如春蛤吓,著一層夾襖步出監(jiān)牢的瞬間宵喂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工会傲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锅棕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓淌山,卻偏偏與公主長得像裸燎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子艾岂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容