摘要:答曰摸索直譯為服務(wù)加載器,最終目的是獲取的實(shí)現(xiàn)類(lèi)。代碼走起首先,要有一個(gè)接口形狀接口介紹然后,要有該接口的實(shí)現(xiàn)類(lèi)。期具體實(shí)現(xiàn)依靠的內(nèi)部類(lèi),感性趣的朋友可以自己看一下。總結(jié)重點(diǎn)在于可跨越包獲取,這一點(diǎn)筆者通過(guò)多模塊項(xiàng)目親測(cè)延時(shí)加載特性
前戲
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實(shí)現(xiàn)類(lèi)。正如前文所說(shuō),它將加載META-INF/services下的配置文件,來(lái)鎖定impl實(shí)現(xiàn)類(lèi)。
代碼走起
1.首先,要有一個(gè)接口
//形狀接口 public interface Shape { String introduce(); //介紹 }
2.然后,要有該接口的實(shí)現(xiàn)類(lèi)。實(shí)現(xiàn)類(lèi)很簡(jiǎn)單,介紹自己的形狀是啥
//實(shí)現(xiàn)類(lèi)一 public class Circle implements Shape { public String introduce() { return "圓形"; //言簡(jiǎn)意賅的介紹 } }
//實(shí)現(xiàn)類(lèi)二 public class Sequare implements Shape { static{ System.out.println("【Sequare】據(jù)說(shuō)有延時(shí)加載,try it.."); } public String introduce() { return "方形"; } }
眼尖的朋友可能已經(jīng)注意到了,這里有個(gè)靜態(tài)塊,因?yàn)橘Y料中有提到ServiceLoader有延時(shí)加載的效果。寡人不信,遂驗(yàn)之……
3.配置文件,放在META-INF/services
文件位置:
- src -main -resources - META-INF - services - xxxpackage.Shape
文件名:包名.接口名
文件內(nèi)容:包名.接口實(shí)現(xiàn)類(lèi),換行符分隔
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ù)說(shuō)有延時(shí)加載,try it.. what"s shape?方形
從該結(jié)果可看出,在調(diào)用it.next()的時(shí)候,才真正的加載了Sequare類(lèi),確確實(shí)實(shí)是延時(shí)加載。期具體實(shí)現(xiàn)依靠ServiceLoader的內(nèi)部類(lèi)LazyIterator,感性趣的朋友可以自己看一下。
總結(jié)ServiceLoader重點(diǎn)在于可跨越j(luò)ar包獲取impl,這一點(diǎn)筆者通過(guò)maven多模塊項(xiàng)目親測(cè)ok
延時(shí)加載特性
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68287.html
摘要:閱讀源碼時(shí),發(fā)現(xiàn)很多,理所當(dāng)然會(huì)想翻閱資料后,該技能,姿勢(shì)如下環(huán)境中的全部屬性全部屬性注意如果將本行代碼放在自定義屬性之后,會(huì)不會(huì)打出把自定義屬性也給獲取到可以結(jié)論會(huì)獲取目前環(huán)境中全部的屬性值,無(wú)論系統(tǒng)提供還是個(gè)人定義系統(tǒng)提供屬性代碼中定義 閱讀源碼時(shí),發(fā)現(xiàn)很多System.getProperty(xxx),理所當(dāng)然會(huì)想:whats fucking this? 翻閱資料后,Get該技能...
摘要:實(shí)現(xiàn)原理淺談幫助理解的示意圖中有一屬性,類(lèi)型是的靜態(tài)內(nèi)部類(lèi)。剛剛說(shuō)過(guò),是一個(gè)中的靜態(tài)內(nèi)部類(lèi),則是的內(nèi)部節(jié)點(diǎn)。這個(gè)會(huì)在線(xiàn)程中,作為其屬性初始是一個(gè)數(shù)組的索引,達(dá)成與類(lèi)似的效果。的方法被調(diào)用時(shí),會(huì)根據(jù)記錄的槽位信息進(jìn)行大掃除。 概述 FastThreadLocal的類(lèi)名本身就充滿(mǎn)了對(duì)ThreadLocal的挑釁,快男FastThreadLocal是怎么快的?源碼中類(lèi)注釋坦白如下: /** ...
引言 本文是源起netty專(zhuān)欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來(lái)越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類(lèi)注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋?zhuān)?import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
引言 本文是源起netty專(zhuān)欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來(lái)越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類(lèi)注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋?zhuān)?import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
引言 本文是源起netty專(zhuān)欄的第4篇文章,很明顯前3篇文章已經(jīng)在偏離主題的道路上越來(lái)越遠(yuǎn)。于是乎,我決定:繼續(xù)保持…… 使用 首先看看源碼類(lèi)注釋中的示例(未改變官方示例邏輯,只是增加了print輸出和注釋?zhuān)?import java.time.LocalTime; import java.util.concurrent.Executors; import java.util.concurrent....
閱讀 3682·2021-09-22 10:52
閱讀 1667·2021-09-09 09:34
閱讀 2063·2021-09-09 09:33
閱讀 834·2019-08-30 15:54
閱讀 2800·2019-08-29 11:15
閱讀 782·2019-08-26 13:37
閱讀 1735·2019-08-26 12:11
閱讀 3051·2019-08-26 12:00