成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【源起Netty 外傳】ServiceLoader詳解

MoAir / 610人閱讀

摘要:答曰摸索直譯為服務(wù)加載器,最終目的是獲取的實現(xiàn)類。代碼走起首先,要有一個接口形狀接口介紹然后,要有該接口的實現(xiàn)類。期具體實現(xiàn)依靠的內(nèi)部類,感性趣的朋友可以自己看一下??偨Y(jié)重點(diǎn)在于可跨越包獲取,這一點(diǎn)筆者通過多模塊項目親測延時加載特性

前戲

netty源碼注釋有云:

...

If a provider class has been installed in a jar file that is
visible to the system class loader, and that jar file contains a
provider-configuration file named
java.nio.channels.spi.SelectorProvider in the resource
directory META-INF/services, then the first class name
specified in that file is taken.  The class is loaded and
instantiated; if this process fails then an unspecified error is
thrown.

...

不知所云?好吧,重點(diǎn)是,jar文件中在META-INF/services目錄下配置了A屬性,以某種方式能加載到。

how can do that? 答曰:ServiceLoader

摸索

ServiceLoader直譯為服務(wù)加載器,最終目的是獲取service的impl實現(xiàn)類。正如前文所說,它將加載META-INF/services下的配置文件,來鎖定impl實現(xiàn)類。

代碼走起

1.首先,要有一個接口

//形狀接口
public interface Shape {
    String introduce(); //介紹
}

2.然后,要有該接口的實現(xiàn)類。實現(xiàn)類很簡單,介紹自己的形狀是啥

//實現(xiàn)類一
public class Circle implements Shape {
    public String introduce() {
        return "圓形";  //言簡意賅的介紹
    }
}
//實現(xiàn)類二
public class Sequare implements Shape {
    static{
        System.out.println("【Sequare】據(jù)說有延時加載,try it..");
    }
    public String introduce() {
        return "方形";
    }
}

眼尖的朋友可能已經(jīng)注意到了,這里有個靜態(tài)塊,因為資料中有提到ServiceLoader有延時加載的效果。寡人不信,遂驗之……

3.配置文件,放在META-INF/services

文件位置:

- src
    -main
        -resources
            - META-INF
                - services
                    - xxxpackage.Shape

文件名:包名.接口名

文件內(nèi)容:包名.接口實現(xiàn)類,換行符分隔

xxxpackage.Circle
xxxpackage.Sequare

4.ServiceLoader調(diào)用

ServiceLoader shapeLoader = ServiceLoader.load(Shape.class);
Iterator it = shapeLoader.iterator();
while(it.hasNext()){
    System.out.println("Iterator next()方法調(diào)用..");
    Shape shape = it.next();
    System.out.printf("what"s shape?%s
",shape.introduce());
}

調(diào)用結(jié)果:

Iterator next()方法調(diào)用..
【Sequare】據(jù)說有延時加載,try it..
what"s shape?方形

從該結(jié)果可看出,在調(diào)用it.next()的時候,才真正的加載了Sequare類,確確實實是延時加載。期具體實現(xiàn)依靠ServiceLoader的內(nèi)部類LazyIterator,感性趣的朋友可以自己看一下。

總結(jié)

ServiceLoader重點(diǎn)在于可跨越j(luò)ar包獲取impl,這一點(diǎn)筆者通過maven多模塊項目親測ok

延時加載特性

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/68287.html

相關(guān)文章

  • 源起Netty 外傳】System.getPropert()詳解

    摘要:閱讀源碼時,發(fā)現(xiàn)很多,理所當(dāng)然會想翻閱資料后,該技能,姿勢如下環(huán)境中的全部屬性全部屬性注意如果將本行代碼放在自定義屬性之后,會不會打出把自定義屬性也給獲取到可以結(jié)論會獲取目前環(huán)境中全部的屬性值,無論系統(tǒng)提供還是個人定義系統(tǒng)提供屬性代碼中定義 閱讀源碼時,發(fā)現(xiàn)很多System.getProperty(xxx),理所當(dāng)然會想:whats fucking this? 翻閱資料后,Get該技能...

    lixiang 評論0 收藏0
  • 源起Netty 外傳】FastThreadLocal怎么Fast?

    摘要:實現(xiàn)原理淺談幫助理解的示意圖中有一屬性,類型是的靜態(tài)內(nèi)部類。剛剛說過,是一個中的靜態(tài)內(nèi)部類,則是的內(nèi)部節(jié)點(diǎn)。這個會在線程中,作為其屬性初始是一個數(shù)組的索引,達(dá)成與類似的效果。的方法被調(diào)用時,會根據(jù)記錄的槽位信息進(jìn)行大掃除。 概述 FastThreadLocal的類名本身就充滿了對ThreadLocal的挑釁,快男FastThreadLocal是怎么快的?源碼中類注釋坦白如下: /** ...

    gxyz 評論0 收藏0
  • 源起Netty 外傳】ScheduledThreadPoolExecutor源碼解讀

    引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    funnyZhang 評論0 收藏0
  • 源起Netty 外傳】ScheduledThreadPoolExecutor源碼解讀

    引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    Eastboat 評論0 收藏0
  • 源起Netty 外傳】ScheduledThreadPoolExecutor源碼解讀

    引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....

    Martin91 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<