<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • JavaSPI機(jī)制的示例分析

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

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

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

            • MySQL-connector

            Java SPI機(jī)制的示例分析

            • JDK中的nio SPI

            Java SPI機(jī)制的示例分析

            再如,logback-classic

            Java SPI機(jī)制的示例分析

            接下來(lái),我們就來(lái)聊聊java SPI機(jī)制

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

            1.1 SPI概念

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

            1.2 SPI規(guī)范

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

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

              • /META-INF/services

              • 放到classpath下

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

              • 文件名是接口全路徑名

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

              • 文件編碼為UTF-8

            • 使用ServiceLoad的load方法


            二、SPI示例

            • 編寫一個(gè)GreetingService接口

            package com.wangmengjun.tutorial.spi;
            public interface GreetingService {
             void sayHello();}
            • 編寫2個(gè)實(shí)現(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è)置實(shí)現(xiàn)類

            Java SPI機(jī)制的示例分析

            • 使用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

            經(jīng)過(guò)上述幾個(gè)步驟,一個(gè)spi的簡(jiǎn)單示例就完成了。

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

            Java SPI機(jī)制的示例分析

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

            Java SPI機(jī)制的示例分析

            Java SPI機(jī)制的示例分析

            Java SPI機(jī)制的示例分析

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

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

            網(wǎng)站名稱:JavaSPI機(jī)制的示例分析
            標(biāo)題來(lái)源:http://www.jbt999.com/article8/jhdiip.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航企業(yè)建站外貿(mào)建站、移動(dòng)網(wǎng)站建設(shè)

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            商城網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 豆花视频入口 | 中文字幕欧美日韩VA免费视频 | 黄色电影高清无码在线观看 | 男女操逼视频在线播放 | 午夜影院在线 |