1. 程式人生 > >java中的SPI機制

java中的SPI機制

1 SPI機制簡介

SPI的全名為Service Provider Interface.大多數開發人員可能不熟悉,因為這個是針對廠商或者外掛的。在java.util.ServiceLoader的文件裡有比較詳細的介紹。簡單的總結下java spi機制的思想。我們系統裡抽象的各個模組,往往有很多不同的實現方案,比如日誌模組的方案,xml解析模組、jdbc模組的方案等。面向的物件的設計裡,我們一般推薦模組之間基於介面程式設計,模組之間不對實現類進行硬編碼。一旦程式碼裡涉及具體的實現類,就違反了可拔插的原則,如果需要替換一種實現,就需要修改程式碼。為了實現在模組裝配的時候能不在程式裡動態指明,這就需要一種服務發現機制。
 java spi就是提供這樣的一個機制:為某個介面尋找服務實現的機制。有點類似IOC的思想,就是將裝配的控制權移到程式之外,在模組化設計中這個機制尤其重要。

2 SPI具體約定

java spi的具體約定為:當服務的提供者,提供了服務介面的一種實現之後,在jar包的META-INF/services/目錄裡同時建立一個以服務介面命名的檔案。該檔案裡就是實現該服務介面的具體實現類。而當外部程式裝配這個模組的時候,就能通過該jar包META-INF/services/裡的配置檔案找到具體的實現類名,並裝載例項化,完成模組的注入。 基於這樣一個約定就能很好的找到服務介面的實現類,而不需要再程式碼裡制定。jdk提供服務實現查詢的一個工具類:java.util.ServiceLoader

3 應用場景

1.common-logging
apache最早提供的日誌的門面介面。只有介面,沒有實現。具體方案由各提供商實現, 發現日誌提供商是通過掃描 META-INF/services/org.apache.commons.logging.LogFactory配置檔案,通過讀取該檔案的內容找到日誌提工商實現類。只要我們的日誌實現裡包含了這個檔案,並在檔案裡制定 LogFactory工廠介面的實現類即可。
      2.jdbc
    jdbc4.0以前, 開發人員還需要基於Class.forName("xxx")的方式來裝載驅動,jdbc4也基於spi的機制來發現驅動提供商了,可以通過META-INF/services/java.sql.Driver檔案裡指定實現類的方式來暴露驅動提供者.

4 案例說明

一個內容管理系統有一個搜尋模組。是基於介面程式設計的。搜尋的實現可能是基於檔案系統的搜尋,也可能是基於資料庫的搜尋

  介面定義如下

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

     A公司採用檔案系統搜尋的方式實現了 Search介面,B公司採用了資料庫系統的方式實現了Search介面

          A公司實現的類  com.A.spi.impl.FileSearch  

          B公司實現的類  com.B.spi.impl.DatabaseSearch  

     那麼A公司釋出 實現jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search檔案中寫下如下內容

     com.A.spi.impl.FileSearch

那麼B公司釋出 實現jar包時,則要在jar包中META-INF/services/my.xyz.spi.Search檔案中寫下如下內容

com.B.spi.impl.DatabaseSearch

  1. package com.xyz.factory;  
  2. import java.util.Iterator;  
  3. import java.util.ServiceLoader;  
  4. import my.xyz.spi.Search;  
  5. public class SearchFactory {  
  6.     private SearchFactory() {  
  7.     }  
  8.     public static Search newSearch() {  
  9.         Search search = null;  
  10.         ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);  
  11.         Iterator<Search> searchs = serviceLoader.iterator();  
  12.         if (searchs.hasNext()) {  
  13.             search = searchs.next();  
  14.         }  
  15.         return search;  
  16.     }  
  17. }  
  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. }  

相關推薦

高階開發必須理解的JavaSPI機制

本文通過探析JDK提供的,在開源專案中比較常用的Java SPI機制,希望給大家在實際開發實踐、學習開源專案提供參考。 SPI是什麼 SPI全稱Service Provider Interface,是Java提供的一套用來被第三方實現或者擴充套件的API,它可以用來啟

JAVA反射機制五(JavaBean的內省與BeanUtils庫)

getc ron 輸出結果 下載 比較 static 完成 自動完成 規則   內省(Introspector) 是Java 語言對JavaBean類屬性、事件的一種缺省處理方法。   JavaBean是一種特殊的類,主要用於傳遞數據信息,這種類中的方法主要用於訪問私有的

JAVA反射機制六(java.lang.reflect包)

instance 檢查 item 類繼承 final win 基類 cte member 一、簡介 java.lang.reflect包提供了用於獲取類和對象的反射信息的類和接口。反射API允許對程序訪問有關加載類的字段,方法和構造函數的信息進行編程訪問。它允許在安全限制

Java反射機制詳解

turn face instance java struct () 分享 2.6 一個     序言       在學習java基礎時,由於學的不紮實,講的實用性不強,就覺得沒用,很多重要的知識就那樣一筆帶過了,像這個馬上要講的反射機制一樣,當時學的時候就忽略了,到後來學習

javaimport機制(指定import和import *的區別)

dem single boot 路徑 list http 簡單 至少 package 轉自:https://www.cnblogs.com/dtts/p/4692480.html java中有兩種包的導入機制,總結如下: 單類型導入(single-type-i

Java反射機制(Reflection)研究及原始碼演示

如下內容內容是關於 Java中反射機制(Reflection)研究及演示的內容。   package com.jiangqq.reflection; import java.lang.reflect.Method; public class Reflection1 { public stati

JDK原始碼分析——JavaSPI機制分析與實戰

重點提示:在我部落格中的所有的原始碼分析的例項,我都將會放到github上,感興趣的朋友可以下載下來除錯執行,我相信還是可以有所收穫的。我的目的是讓所有讀到我部落格的朋友都可以瞭解到有價值的東西,學習到java核心的原理,使用起來更加得心應手。 所有例項的GitHub地址:https://git

JavaSPI機制淺析與簡單示例

一、SPI機制         這裡先說下SPI的一個概念,SPI英文為Service Provider Interface單從字面可以理解為Service提供者介面,正如從SPI的名字去理解SPI

Java反射機制和Class.forName、例項物件.class(屬性)、例項物件getClass()的區別

二、Class.forName、例項物件.class(屬性)、例項物件getClass()的區別 1、相同點: 通過這幾種方式,得到的都是Java.lang.Class物件(這個是上面講到的 類在載入時獲得的最終產物) 例如: package demo;public class A{ public st

JavaSpi機制心得

首先說一下問題。 昨日在看JDBC原始碼當看到DriverManage.getConnection()這個方法,點進去DriverManage類看到getConnection()方法裡核心語句確實下面這個for(DriverInfo aDriver : registered

Java和dubboSPI機制學習

為了實現在模組裝配時的時候不在程式中動態指明,需要提供一種服務發現機制,為某個介面尋找服務實現的機制,就是將裝配的控制權轉移到程式之外,在模組化設計中這個機制尤其重要。 Java SPI(Service Provider Interface)的具體約定如下:當服務的提供者提供了服務介面的一種實現之

javaSPI機制

1 SPI機制簡介 SPI的全名為Service Provider Interface.大多數開發人員可能不熟悉,因為這個是針對廠商或者外掛的。在java.util.ServiceLoader的文件裡有比較詳細的介紹。簡單的總結下java spi機制的思想。我們系統裡抽象的各個模組,往往有很多不同的實現方

Java】深入理解Javaspi機制

per 提供者 num asn 自動類型轉換 value imp 中大 util 深入理解Java中的spi機制 SPI全名為Service Provider Interface是JDK內置的一種服務提供發現機制,是Java提供的一套用來被第三方實現或者擴展的API,它可以

結合實戰和原始碼來聊聊JavaSPI機制

## 寫在前面 > SPI機制能夠非常方便的為某個介面動態指定其實現類,在某種程度上,這也是某些框架具有高度可擴充套件性的基礎。今天,我們就從原始碼級別深入探討下Java中的SPI機制。 > > 注:文章已收錄到:[https://github.com/sunshinelyz/techno

Java的反射機制

導致 buffer 自己 net -- 實例 reflect .config lang 學習Java的同學註意了!!! 學習過程中遇到什麽問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:618528494 我們一起學Java!

java的key事件監聽機制

com java.awt imp package 時間 ext javax .get pri package com.at221; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; im

Java的反射機制(一)

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

Java 的事件監聽機制

add import userdata 開發人員 util ner dns pre sta 看項目代碼時遇到了好多事件監聽機制相關的代碼。現學習一下: java事件機制包含三個部分:事件、事件監聽器、事件源。 1.事件:繼承自java.util.EventO

Java的事件監聽機制

void 初始化 release vax 輸入 logs p s get location 鼠標事件監聽機制的三個方面: 1.事件源對象:   事件源對象就是能夠產生動作的對象。在Java語言中所有的容器組件和元素組件都是事件監聽中的事件源對象。Java中根據事件的動作來區

java存在垃圾回收機制,但是還會有內存泄漏的問題,原因是

java 自己 data .so 這樣的 即使 垃圾 ref stack 答案是肯定的,但不能拿這一句回答面試官的問題。分析:JAVA是支持垃圾回收機制的,在這樣的一個背景下,內存泄露又被稱為“無意識的對象保持”。如果一個對象引用被無意識地保留下來,那麽垃圾回收器不僅不會處