溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring IOC容器為什么不使用Class.forName加載類

發(fā)布時(shí)間:2021-12-02 16:09:50 來源:億速云 閱讀:142 作者:柒染 欄目:云計(jì)算

Spring IOC容器為什么不使用Class.forName加載類,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

今天我們要學(xué)習(xí)的Spring IOC 容器為什么不使用 Class.forName 加載類,而是使用 ClassLoader!

Spring IOC容器為什么不使用Class.forName加載類

雖然 Class.forName() 和 ClassLoader 都可用來對類進(jìn)行加載,但是它們還是有些區(qū)別的。為了說明它們,我們來看看 JVM 加載類的步驟是什么!

Spring IOC容器為什么不使用Class.forName加載類

Spring IOC容器為什么不使用Class.forName加載類

清楚上面這個(gè)之后,再要想搞明白 Spring Ioc中為什么使用 Classloader,而不是 Class.forName,還得從它們的區(qū)別說起。我們先來看看如果使用 Class.forName 會(huì)發(fā)生什么!

先創(chuàng)建一個(gè)測試類。

Spring IOC容器為什么不使用Class.forName加載類

上面的代碼中, Class.forName("com.xttblog.Xttblog") 的調(diào)用會(huì)觸發(fā) Xttblog 的靜態(tài)代碼塊的執(zhí)行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不會(huì)。

調(diào)用 Class.forName 其實(shí)相當(dāng)于調(diào)用了 Class.forName(className, true, currentLoader), 這個(gè)方法的第二個(gè)參數(shù)表示是否需要初始化類。源碼中設(shè)置為 true, 因此 Class.forName 獲取到 Class 對象時(shí), 會(huì)自動(dòng)對類進(jìn)行初始化的。并且 Class.forName 加載類的 ClassLoader 和調(diào)用 Class.forName 所在的類的 ClassLoader 相同。上面的代碼中, Class.forName("com.xttblog.Xttblog") 的調(diào)用會(huì)觸發(fā) Xttblog 的靜態(tài)代碼塊的執(zhí)行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不會(huì)。

我們知道 Spring 的 IOC 中有一個(gè)懶加載(延遲加載),如果你使用了 Class.forName,那么懶加載這個(gè)功能就無法實(shí)現(xiàn)了。Spring IoC 為了加快初始化速度,因此大量使用了延時(shí)加載技術(shù)。而使用 classloader 不需要執(zhí)行類中的初始化代碼,可以加快加載速度,把類的初始化工作留到實(shí)際使用到這個(gè)類的時(shí)候。

所以,Spring IOC 容器并沒有采用 Class.forName 來加載類。

看完上述內(nèi)容,你們掌握Spring IOC容器為什么不使用Class.forName加載類的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI