Java SPI 機(jī)制實(shí)現(xiàn)解耦與本地化

SPI 是 Java 提供的一種服務(wù)加載方式,全名為 Service Provider Interface泻拦,可以避免在 Java 代碼中寫(xiě)死服務(wù)的提供者烈疚,而是通過(guò) SPI 服務(wù)加載機(jī)制進(jìn)行服務(wù)的注冊(cè)和發(fā)現(xiàn)。通過(guò)這種方式聪轿,可以基于接口編程爷肝,實(shí)現(xiàn)多個(gè)模塊的解耦。


SPI 機(jī)制實(shí)現(xiàn)解耦

如下的示例展示了通過(guò) ServiceLoader 類(lèi)加載指定接口的所有服務(wù)提供者并進(jìn)行調(diào)用的簡(jiǎn)單實(shí)現(xiàn)陆错。

1灯抛、定義接口 test.DirMonitor,包含一個(gè)方法 start()音瓷;

2对嚼、實(shí)現(xiàn)接口 test.DirMonitor,定義兩個(gè)實(shí)現(xiàn)類(lèi) test.ObserverMonitor 和 test.LoopMonitor绳慎;

3纵竖、設(shè)置接口的實(shí)現(xiàn)類(lèi)列表。創(chuàng)建目錄 META-INF/services/杏愤,新建文件 test.DirMonitor靡砌,內(nèi)容如下:

test.ObserverMonitor

test.LoopMonitor

4、在程序中通過(guò) ServiceLoader 類(lèi)加載 test.DirMonitor 接口的實(shí)現(xiàn)類(lèi)珊楼,并遍歷所有實(shí)現(xiàn)類(lèi)通殃,調(diào)用 start() 方法;

從上面的示例可以看出厕宗,在代碼中僅僅使用到了接口 test.DirMonitor画舌,并沒(méi)有在代碼中使用到具體實(shí)現(xiàn)類(lèi)堕担。通過(guò)這種方法,可以實(shí)現(xiàn)解耦曲聂,接口與實(shí)現(xiàn)類(lèi)可以由不同的開(kāi)發(fā)人員實(shí)現(xiàn)洋闽,編譯到不同的 jar 包中泡徙,甚至實(shí)現(xiàn)插件的定義與開(kāi)發(fā)宙址。


spi 包的本地化擴(kuò)展

java.util.spi 包提供了一些抽象類(lèi)廊遍,可以用于擴(kuò)展 Java 的本地化服務(wù)。本地化 SPI 的使用方法與 ServiceLoader 的 SPI 稍有不同乍丈,本地化 SPI 的實(shí)現(xiàn)需要打包成 jar 包后剂碴,放置于運(yùn)行的 jre/lib/ext 目錄下方能生效。java.util.spi 包提供的抽象類(lèi)如下所示:

CalendarDataProvider:為 java.util.Calendar 類(lèi)的參數(shù)提供本地化數(shù)據(jù)的服務(wù)提供者的抽象類(lèi)轻专;

CalendarNameProvider:為 java.util.Calendar 類(lèi)的字段提供本地化名稱(chēng)的服務(wù)提供者的抽象類(lèi)忆矛;

CurrencyNameProvider:為 java.util.Currency 提供本地化貨幣符號(hào)名稱(chēng)的服務(wù)提供者的抽象類(lèi);

LocaleNameProvider:為 java.util.Locale 類(lèi)提供本地化名稱(chēng)的服務(wù)提供者的抽象類(lèi)请垛;

LocaleServiceProvider:其他服務(wù)提供者抽象類(lèi)的基類(lèi)催训;

ResourceBundleControlProvider:服務(wù)接口,用于提供 java.util.ResourceBundle.Control 的實(shí)現(xiàn)類(lèi)宗收;

TimeZoneNameProvider:為 java.util.TimeZone 提供本地化時(shí)區(qū)的服務(wù)提供者的抽象類(lèi)漫拭。

以 CalendarDataProvider 為例,該抽象類(lèi)用于實(shí)現(xiàn)本地化的日歷數(shù)據(jù)混稽。在下面的例子中采驻,CalendarDataProviderSPI 類(lèi)設(shè)置了每周的第一天為 3,一年中第一周所需的最少天數(shù)為 6匈勋。

按照 SPI 的要求礼旅,在 META-INF/services/ 下建立 java.util.spi.CalendarDataProvider 文件,并寫(xiě)入 testspi.CalendarDataProviderSPI洽洁。打包為 jar 后痘系,放置于 jre/lib/ext 目錄后,執(zhí)行下面的代碼饿自,則打印的數(shù)字分別為 3 和 6汰翠,而不再是默認(rèn)的 1 和 1。


總結(jié)

Java 通過(guò) SPI 機(jī)制為我們提供了一種服務(wù)發(fā)現(xiàn)機(jī)制昭雌。通過(guò)在 META-INF/services/ 目錄下創(chuàng)建以接口全限定名為名稱(chēng)的文件复唤,并在文件中每行寫(xiě)入一個(gè)服務(wù)提供者的全限定名,Java 可以發(fā)現(xiàn)并創(chuàng)建服務(wù)提供者的實(shí)例城豁。

通過(guò) ServiceLoader 我們可以獲取指定接口的所有服務(wù)提供者苟穆,并實(shí)現(xiàn)接口調(diào)用與服務(wù)提供者的解耦抄课。通過(guò)實(shí)現(xiàn) spi 包的抽象接口唱星,并放置于 jre/lib/ext 目錄下雳旅,可以實(shí)現(xiàn) Java 的本地化。

Java SPI 機(jī)制實(shí)現(xiàn)解耦與本地化?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末间聊,一起剝皮案震驚了整個(gè)濱河市攒盈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哎榴,老刑警劉巖型豁,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尚蝌,居然都是意外死亡迎变,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)飘言,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)衣形,“玉大人,你說(shuō)我怎么就攤上這事姿鸿∽晃猓” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵苛预,是天一觀的道長(zhǎng)句狼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)热某,這世上最難降的妖魔是什么腻菇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮昔馋,結(jié)果婚禮上芜繁,老公的妹妹穿的比我還像新娘。我一直安慰自己绒极,他們只是感情好骏令,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著垄提,像睡著了一般榔袋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铡俐,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天凰兑,我揣著相機(jī)與錄音,去河邊找鬼审丘。 笑死吏够,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锅知,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼播急,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了售睹?” 一聲冷哼從身側(cè)響起桩警,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昌妹,沒(méi)想到半個(gè)月后捶枢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飞崖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烂叔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片固歪。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡长已,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昼牛,到底是詐尸還是另有隱情术瓮,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布贰健,位于F島的核電站胞四,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伶椿。R本人自食惡果不足惜辜伟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脊另。 院中可真熱鬧导狡,春花似錦、人聲如沸偎痛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)踩麦。三九已至枚赡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谓谦,已是汗流浹背贫橙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留反粥,地道東北人卢肃。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓疲迂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莫湘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尤蒿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)逊脯,斷路器优质,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法竣贪,類(lèi)相關(guān)的語(yǔ)法军洼,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法演怎,異常的語(yǔ)法匕争,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,632評(píng)論 18 399
  • (一)Java部分 1、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,107評(píng)論 0 62
  • 20161112《加油跑杭,小川!》 最近迷上早上做養(yǎng)生咆耿,靜靜的躺在床上德谅,全身一個(gè)部位,一個(gè)部位地做萨螺。 昨晚拖拖拉拉到...
    一棵樹(shù)閱讀 220評(píng)論 2 1
  • 每個(gè)人都會(huì)把自己扮演各種的角色窄做,生活中的,工作的慰技,家人眼中的椭盏,朋友眼中的,我們都想把每一個(gè)角色做好吻商,卻都好像又沒(méi)有...
    小2貨閱讀 516評(píng)論 0 1