摘要:答曰摸索直譯為服務(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)用
ServiceLoadershapeLoader = 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é)果:
Iteratornext()方法調(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
摘要:閱讀源碼時,發(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該技能...
摘要:實現(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是怎么快的?源碼中類注釋坦白如下: /** ...
引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
引言 本文是源起netty專欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋) import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
閱讀 3589·2021-09-22 10:52
閱讀 1600·2021-09-09 09:34
閱讀 2001·2021-09-09 09:33
閱讀 768·2019-08-30 15:54
閱讀 2687·2019-08-29 11:15
閱讀 726·2019-08-26 13:37
閱讀 1680·2019-08-26 12:11
閱讀 2987·2019-08-26 12:00