日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK的SPI机制

發(fā)布時間:2024/9/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK的SPI机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

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

1.common-logging

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

2.jdbc???

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

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

??? 接口定義如下

  • package?my.xyz.spi;??
  • import?java.util.List;??
  • public?interface?Search?{??
  • ? ?public?List?serch(String?keyword);??
  • }????
  • ? ? ?A公司采用文件系統(tǒng)搜索的方式實現(xiàn)了 Search接口,B公司采用了數(shù)據(jù)庫系統(tǒng)的方式實現(xiàn)了Search接口

    ? ? ? ? ? A公司實現(xiàn)的類 ?com.A.spi.impl.FileSearch ?

    ? ? ? ? ? B公司實現(xiàn)的類 ?com.B.spi.impl.DatabaseSearch ?

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

    ? ? ?com.A.spi.impl.FileSearch

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

    ??com.B.spi.impl.DatabaseSearch

  • 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;??
  • ????}??
  • }??
  • package?my.xyz.test;??
  • import?java.util.Iterator;??
  • import?java.util.ServiceLoader;??
  • import?com.xyz.factory.SearchFactory;??
  • import?my.xyz.spi.Search;??
  • public?class?SearchTest?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Search?search?=?SearchFactory.newSearch();??
  • ????????search.serch("java?spi?test");??
  • ????}??
  • } ?
  • 來源:JDK的SPI機制_我有一個夢想-CSDN博客_jdk spi

    總結(jié)

    以上是生活随笔為你收集整理的JDK的SPI机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。