Spring IOC 容器為什麼不使用 Class.forName 載入類
點選上方“業餘草”,選擇“置頂公眾號”
第一時間獲取技術乾貨和業界資訊!
很多人看過 Spring 的原始碼,但是他們都是為了看原始碼而看!並沒有讀懂 Spring 的設計思想,也沒有思考過為什麼要這樣設計!
我在這篇文章《程式設計師如何閱讀原始碼?大牛是如果形成的?》中,已經寫到了如何閱讀原始碼。而我的同事按照上面的步驟並結合自身的情況,再過去的幾個月看了不少的原始碼。最終今年破格加薪 2K !
那麼接下來我呀說的是,有哪些是你在看原始碼的過程中並沒有注意的細節和內容。比如,今天我們要學習的Spring IOC 容器為什麼不使用 Class.forName 載入類,而是使用 ClassLoader!
雖然 Class.forName() 和 ClassLoader 都可用來對類進行載入,但是它們還是有些區別的。為了說明它們,我們來看看 JVM 載入類的步驟是什麼!
清楚上面這個之後,再要想搞明白 Spring Ioc中為什麼使用 Classloader,而不是 Class.forName,還得從它們的區別說起。我們先來看看如果使用 Class.forName 會發生什麼!
先建立一個測試類。
上面的程式碼中, Class.forName("com.xttblog.Xttblog") 的呼叫會觸發 Xttblog 的靜態程式碼塊的執行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 並不會。
呼叫 Class.forName 其實相當於呼叫了 Class.forName(className, true, currentLoader), 這個方法的第二個參數列示是否需要初始化類。原始碼中設定為 true, 因此 Class.forName 獲取到 Class 物件時, 會自動對類進行初始化的。並且 Class.forName 載入類的 ClassLoader 和呼叫 Class.forName 所在的類的 ClassLoader 相同。上面的程式碼中, Class.forName("com.xttblog.Xttblog") 的呼叫會觸發 Xttblog 的靜態程式碼塊的執行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 並不會。
我們知道 Spring 的 IOC 中有一個懶載入(延遲載入),如果你使用了 Class.forName,那麼懶載入這個功能就無法實現了。Spring IoC 為了加快初始化速度,因此大量使用了延時載入技術。而使用 classloader 不需要執行類中的初始化程式碼,可以加快載入速度,把類的初始化工作留到實際使用到這個類的時候。
所以,Spring IOC 容器並沒有採用 Class.forName 來載入類。
原文連結:https://www.xttblog.com/?p=3907
10T技術資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,GO等等。在公眾號內回覆對應關鍵字或框架名字,即可免費獲取!!
你再主動一點點 我們就有故事了
相關文章
- 為什麼不推薦在Spring Boot中使用@Value載入配置Spring Boot
- Spring IOC容器概念及分類Spring
- Spring原始碼剖析3:Spring IOC容器的載入過程Spring原始碼
- Spring原始碼解讀(1)-IOC容器BeanDefinition的載入Spring原始碼Bean
- 為什麼大多數IOC容器使用ApplicationContext,而不用BeanFactoryAPPContextBean
- Spring IOC 為什麼能降低耦合Spring
- 2、Spring使用+ioc容器配置使用1Spring
- spring原始碼解析之IOC容器(二)------載入和註冊Spring原始碼
- Spring--IOC容器Spring
- Spring框架IOC容器Spring框架
- Spring的IOC容器Spring
- 為什麼Spring官方不推薦使用 @Autowired?Spring
- 深入Spring之IOC之載入BeanDefinitionSpringBean
- Spring中為什麼不建議使用欄位注入Spring
- Spring IoC 到底是什麼Spring
- 深入理解Spring IOC容器Spring
- 對Spring IOC容器的思考Spring
- 淺析 Spring 的IOC容器Spring
- Spring IOC 一——Spring容器裝配BeanSpringBean
- 03-Spring IOC容器的基本使用(註解的使用)Spring
- Spring5原始碼解析系列一——IoC容器核心類圖Spring原始碼
- Spring IoC 容器的擴充套件Spring套件
- 手寫Spring---IOC容器(1)Spring
- Spring IOC容器實現機制Spring
- Spring原始碼分析:Spring IOC容器初始化Spring原始碼
- 為什麼Java中有三種基礎的類載入器?Java
- spring的懶載入,有什麼作用?Spring
- Spring原始碼閱讀-IoC容器解析Spring原始碼
- spring原始碼解析之IOC容器(一)Spring原始碼
- Spring IOC容器核心流程原始碼分析Spring原始碼
- Spring 原始碼閱讀(二)IoC 容器初始化以及 BeanFactory 建立和 BeanDefinition 載入過程Spring原始碼Bean
- Spring使用之IOCSpring
- 為什麼不建議使用gotoGo
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- Spring的IOC是啥?有什麼好處?Spring
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- Spring IOC容器的設計與實現Spring
- 為什麼在容器中 1 號程式掛不上 arthas?