Spring IOC容器為什么不使用Class.forName加載類,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
成都創(chuàng)新互聯(lián)公司專注于商河企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。商河網(wǎng)站建設(shè)公司,為商河等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
今天我們要學(xué)習(xí)的Spring IOC 容器為什么不使用 Class.forName 加載類,而是使用 ClassLoader!
雖然 Class.forName() 和 ClassLoader 都可用來對類進(jìn)行加載,但是它們還是有些區(qū)別的。為了說明它們,我們來看看 JVM 加載類的步驟是什么!
清楚上面這個(gè)之后,再要想搞明白 Spring Ioc中為什么使用 Classloader,而不是 Class.forName,還得從它們的區(qū)別說起。我們先來看看如果使用 Class.forName 會發(fā)生什么!
先創(chuàng)建一個(gè)測試類。
上面的代碼中, Class.forName("com.xttblog.Xttblog") 的調(diào)用會觸發(fā) Xttblog 的靜態(tài)代碼塊的執(zhí)行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不會。
調(diào)用 Class.forName 其實(shí)相當(dāng)于調(diào)用了 Class.forName(className, true, currentLoader), 這個(gè)方法的第二個(gè)參數(shù)表示是否需要初始化類。源碼中設(shè)置為 true, 因此 Class.forName 獲取到 Class 對象時(shí), 會自動對類進(jìn)行初始化的。并且 Class.forName 加載類的 ClassLoader 和調(diào)用 Class.forName 所在的類的 ClassLoader 相同。上面的代碼中, Class.forName("com.xttblog.Xttblog") 的調(diào)用會觸發(fā) Xttblog 的靜態(tài)代碼塊的執(zhí)行, 而 ClassLoader.getSystemClassLoader().loadClass("com.xttblog.Xttblog") 并不會。
我們知道 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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站欄目:SpringIOC容器為什么不使用Class.forName加載類
分享地址:http://aaarwkj.com/article42/iipdhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、小程序開發(fā)、網(wǎng)站設(shè)計(jì)、定制開發(fā)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)