欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年06月10日 11:32:13   作者:噠噠Da  
這篇文章主要介紹了JAVA SPI機(jī)制的相關(guān)知識以及使用示例,文中代碼非常詳細(xì),幫助大家更好的學(xué)習(xí),感興趣的朋友可以了解下

JAVA SPI 簡介

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

SPI 機(jī)制的約定

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

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

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

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

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

JDBC

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

COMMON-LOGGING

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

SPI 機(jī)制代碼示例

接口 People.java

package org.louis.spi.test;

public interface People {

  public String speak();

}

實現(xiàn)類 Chinese.java

package org.louis.spi.test;
 
public class Chinese implements People{

 public String speak() {
 
  return "Chinese speak Chinese.";
 
 }
 
}

實現(xiàn)類 American.java

package org.louis.spi.test;
 
public class American implements People{

 public String speak() {
 
  return "American speak English.";
 
 }
 
}

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

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

文件內(nèi)容:

org.louis.spi.test.Chinese
org.louis.spi.test.American

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

運行結(jié)果:

Chinese speak Chinese.

American speak English.

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

以上就是示例講解JAVA SPI機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于JAVA SPI機(jī)制的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中處理stream.filter()的實例代碼

    java中處理stream.filter()的實例代碼

    stream()是Java 8中的一個函數(shù)式接口,用于處理數(shù)據(jù)流,它可以從一個數(shù)據(jù)源,如集合,數(shù)組等生成一個流,這篇文章主要給大家介紹了關(guān)于java中處理stream.filter()的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • idea中mapper如何快速跳轉(zhuǎn)到xml插件

    idea中mapper如何快速跳轉(zhuǎn)到xml插件

    這篇文章主要介紹了idea中mapper如何快速跳轉(zhuǎn)到xml插件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java學(xué)習(xí)之反射機(jī)制及應(yīng)用場景介紹

    Java學(xué)習(xí)之反射機(jī)制及應(yīng)用場景介紹

    本篇文章主要介紹了Java反射機(jī)制及應(yīng)用場景,反射機(jī)制是很多Java框架的基石。非常具有實用價值,需要的朋友可以參考下。
    2016-11-11
  • 基于java中cas實現(xiàn)的探索

    基于java中cas實現(xiàn)的探索

    這篇文章主要介紹了java中cas實現(xiàn)的探索,基于很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 歸并排序時間復(fù)雜度過程推導(dǎo)詳解

    歸并排序時間復(fù)雜度過程推導(dǎo)詳解

    這篇文章主要介紹了C語言實現(xiàn)排序算法之歸并排序,對歸并排序的原理及實現(xiàn)過程做了非常詳細(xì)的解讀,需要的朋友可以參考下,希望能幫助到你
    2021-08-08
  • java同步之如何寫一個鎖Lock

    java同步之如何寫一個鎖Lock

    本篇文章的目標(biāo)一是自己動手寫一個鎖,這個鎖的功能很簡單,能進(jìn)行正常的加鎖、解鎖操作。能更好地理解后面章節(jié)將要學(xué)習(xí)的AQS及各種同步器實現(xiàn)的原理。下面小編來和大家一起學(xué)習(xí)下吧
    2019-05-05
  • Spring security基于數(shù)據(jù)庫中賬戶密碼認(rèn)證

    Spring security基于數(shù)據(jù)庫中賬戶密碼認(rèn)證

    這篇文章主要介紹了Spring security基于數(shù)據(jù)庫中賬戶密碼認(rèn)證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • MybatisPlus開啟、關(guān)閉二級緩存方法

    MybatisPlus開啟、關(guān)閉二級緩存方法

    本文主要介紹了MybatisPlus開啟、關(guān)閉二級緩存方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringMVC九大組件之HandlerMapping詳解

    SpringMVC九大組件之HandlerMapping詳解

    這篇文章主要介紹了SpringMVC九大組件之HandlerMapping詳解,HandlerMapping 叫做處理器映射器,它的作用就是根據(jù)當(dāng)前 request 找到對應(yīng)的 Handler 和 Interceptor,然后封裝成一個 HandlerExecutionChain 對象返回,需要的朋友可以參考下
    2023-09-09
  • Java字節(jié)碼操縱框架ASM圖文實例詳解

    Java字節(jié)碼操縱框架ASM圖文實例詳解

    這篇文章主要為大家介紹了Java字節(jié)碼操縱框架ASM圖文實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論