中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java SPI機制的示例分析

發布時間:2021-09-18 11:49:37 來源:億速云 閱讀:138 作者:柒染 欄目:編程語言

這期內容當中小編將會給大家帶來有關Java SPI機制的示例分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在平時開發項目的過程中,相信很多讀者都看到過這樣的目錄,/META-INF/services目錄,該目錄下的文件名是接口的全稱,其內容是具體的接口實現。這就是使用了SPI機制。如:

Java SPI機制的示例分析

  • JDK中的nio SPI

Java SPI機制的示例分析

再如,logback-classic

Java SPI機制的示例分析

接下來,我們就來聊聊java SPI機制

一、SPI概念和規范

1.1 SPI概念

SPI全稱為  Service Provicder Interface,是JDK內置的一種服務提供發現功能,一種動態替換發現的機制。
舉個例子,要想在運行時動態給一個接口添加實現,只需要添加一個實現即可。比如JDBC的數據庫驅動模塊,不同數據庫連接驅動接口相同但實現類不同,通常各大廠商(如Mysql、Oracle)會根據一個統一的規范(java.sql.Driver)開發各自的驅動實現邏輯。客戶端使用jdbc時不需要去改變代碼,直接引入不同的spi接口服務即可。  

1.2 SPI規范

使用SPI也需要遵循一定的規范,主要包含如下幾點:

  • 需要設置/META-INF/目錄

    • /META-INF/services

    • 放到classpath下

  • /META-INF/services/目錄下放置配置文件

    • 文件名是接口全路徑名

    • 文件內部是要實現的接口實現類

    • 文件編碼為UTF-8

  • 使用ServiceLoad的load方法


二、SPI示例

  • 編寫一個GreetingService接口

package com.wangmengjun.tutorial.spi;
public interface GreetingService {
 void sayHello();}
  • 編寫2個實現類,分別輸出英文和中文

package com.wangmengjun.tutorial.spi.impl;
import com.wangmengjun.tutorial.spi.GreetingService;
public class EnglishGreetingServiceImpl implements GreetingService{
 public void sayHello() {    System.out.println("Hello , This is SPI");      }
}
package com.wangmengjun.tutorial.spi.impl;
import com.wangmengjun.tutorial.spi.GreetingService;
public class ChineseGreetingServiceImpl implements GreetingService {
 public void sayHello() {    System.out.println("你好,這是SPI");      }
}
  • 創建META-INF文件目錄并設置實現類

Java SPI機制的示例分析

  • 使用ServiceLoader

package com.wangmengjun.tutorial.spi;
import java.util.Iterator;import java.util.ServiceLoader;
public class SpiMain {
 public static void main(String[] args) {        ServiceLoader<GreetingService> loader= ServiceLoader.load(GreetingService.class);      Iterator<GreetingService> greetingIter = loader.iterator();      while(greetingIter.hasNext()) {          GreetingService service=  greetingIter.next();          System.out.println(service.getClass().getName());          service.sayHello();      }  }}

輸出:

com.wangmengjun.tutorial.spi.impl.EnglishGreetingServiceImplHello , This is SPIcom.wangmengjun.tutorial.spi.impl.ChineseGreetingServiceImpl你好,這是SPI

經過上述幾個步驟,一個spi的簡單示例就完成了。

當執行ServiceLoader.load(GreetingService.class)構造完ServiceLoader實例我們可以看到這個時lookupIterator1的值還是null的。這個時候還沒有去讀取配置文件中的實現類信息。
    // The lazy-lookup iterator for iterator operations    private Iterator<Provider<S>> lookupIterator1;    private final List<S> instantiatedProviders = new ArrayList<>();

Java SPI機制的示例分析

當使用迭代器去遍歷的時候,才會讀取對應的配置文件去解析,調用hasNext方法的時候會去加載配置文件進行解析。文件讀取采用BufferedReader的readLine來讀取并解析。

Java SPI機制的示例分析

Java SPI機制的示例分析

Java SPI機制的示例分析

從上述的示例可以看出:雖然ServiceLoader也算是使用的延遲加載,但是需要通過迭代器迭代獲取  ,所有配置的實現類都要實例化一遍。如果你并不想用某些實現類,它也被加載并實例化了,這就造成了浪費。  

上述就是小編為大家分享的Java SPI機制的示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

庆安县| 绥化市| 舞阳县| 特克斯县| 西峡县| 砀山县| 阳谷县| 龙岩市| 赤壁市| 昆山市| 新绛县| 晋城| 万山特区| 资中县| 高尔夫| 罗甸县| 任丘市| 上饶市| 平凉市| 镇江市| 当雄县| 棋牌| 长乐市| 德昌县| 库尔勒市| 鄂伦春自治旗| 六枝特区| 永和县| 伊通| 平安县| 柳州市| 高陵县| 白朗县| 保靖县| 彝良县| 垫江县| 英山县| 潜山县| 涞源县| 山丹县| 嘉兴市|