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