真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JavaSPI機制的示例分析

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)Java SPI機制的示例分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名與空間、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、招遠(yuǎn)網(wǎng)站維護、網(wǎng)站推廣。

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

  • MySQL-connector

Java SPI機制的示例分析

  • JDK中的nio SPI

Java SPI機制的示例分析

再如,logback-classic

Java SPI機制的示例分析

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

一、SPI概念和規(guī)范

1.1 SPI概念

SPI全稱為  Service Provicder Interface,是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)功能,一種動態(tài)替換發(fā)現(xiàn)的機制。
舉個例子,要想在運行時動態(tài)給一個接口添加實現(xiàn),只需要添加一個實現(xiàn)即可。比如JDBC的數(shù)據(jù)庫驅(qū)動模塊,不同數(shù)據(jù)庫連接驅(qū)動接口相同但實現(xiàn)類不同,通常各大廠商(如Mysql、Oracle)會根據(jù)一個統(tǒng)一的規(guī)范(java.sql.Driver)開發(fā)各自的驅(qū)動實現(xiàn)邏輯??蛻舳耸褂胘dbc時不需要去改變代碼,直接引入不同的spi接口服務(wù)即可。  

1.2 SPI規(guī)范

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

  • 需要設(shè)置/META-INF/目錄

    • /META-INF/services

    • 放到classpath下

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

    • 文件名是接口全路徑名

    • 文件內(nèi)部是要實現(xiàn)的接口實現(xiàn)類

    • 文件編碼為UTF-8

  • 使用ServiceLoad的load方法


二、SPI示例

  • 編寫一個GreetingService接口

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

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");      }
}
  • 創(chuàng)建META-INF文件目錄并設(shè)置實現(xiàn)類

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 loader= ServiceLoader.load(GreetingService.class);      Iterator 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

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

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

Java SPI機制的示例分析

當(dāng)使用迭代器去遍歷的時候,才會讀取對應(yīng)的配置文件去解析,調(diào)用hasNext方法的時候會去加載配置文件進行解析。文件讀取采用BufferedReader的readLine來讀取并解析。

Java SPI機制的示例分析

Java SPI機制的示例分析

Java SPI機制的示例分析

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

上述就是小編為大家分享的Java SPI機制的示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站題目:JavaSPI機制的示例分析
網(wǎng)址分享:http://weahome.cn/article/jhdiip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部