摘要:類加載模型為了支持這套目錄結(jié)構(gòu),并對目錄里面的類庫進行加載和隔離,自定義了多個類加載器,這些類加載器按照經(jīng)典的雙親委派模型來實現(xiàn),如下圖所示加載問題加載器的實現(xiàn)清晰易懂,并且采用了官方推薦的正統(tǒng)的使用類加載器的方式。
一個功能健全的Web服務(wù)器,要解決如下幾個問題
部署在同一個服務(wù)器上的兩個Web應(yīng)用程序使用的Java類庫可以實現(xiàn)相互隔離。不能要求一個類庫在一個服務(wù)器中只有一份,服務(wù)器應(yīng)當(dāng)保證兩個應(yīng)用程序的類庫可以互相獨立使用。
部署在同一個服務(wù)器上的兩個Web應(yīng)用程序所使用的Java類庫可以互相共享,如果Java類庫不能共享使用,虛擬機的方法區(qū)很容易出現(xiàn)過度膨脹的風(fēng)險,比如一臺服務(wù)器上部署了10個使用Spring的程序。
服務(wù)器需要盡可能保證自身安全不受部署的Web應(yīng)用程序影響。服務(wù)器所使用的類庫應(yīng)該與應(yīng)用程序使用的類庫互相獨立。
支持JSP的服務(wù)器,大部分都需要支持HotSwap功能(熱交換功能)
tomcat的lib目錄結(jié)構(gòu)Tomcat目錄結(jié)構(gòu)中,有三組目錄(“/common/”,“/server/”和“shared/”)可以存放公用Java類庫,此外還有第四組Web應(yīng)用程序自身的目錄“/WEB-INF/”,把java類庫放置在這些目錄中的含義分別是:
放置在common目錄中:類庫可被Tomcat和所有的Web應(yīng)用程序共同使用。
放置在server目錄中:類庫可被Tomcat使用,但對所有的Web應(yīng)用程序都不可見。
放置在shared目錄中:類庫可被所有的Web應(yīng)用程序共同使用,但對Tomcat自己不可見。所有jar都合在lib包下
放置在/WebApp/WEB-INF目錄中:類庫僅僅可以被此Web應(yīng)用程序使用,對Tomcat和其他Web應(yīng)用程序都不可見。
注:tomcat 在6以后。廢棄了/common目錄,默認沒有shared目錄。
tomcat類加載模型為了支持這套目錄結(jié)構(gòu),并對目錄里面的類庫進行加載和隔離,Tomcat自定義了多個類加載器,這些類加載器按照經(jīng)典的雙親委派模型來實現(xiàn),如下圖所示 :
Tomcat 加載器的實現(xiàn)清晰易懂,并且采用了官方推薦的“正統(tǒng)”的使用類加載器的方式。這時作者提一個問題:如果有 10 個 Web 應(yīng)用程序都用到了spring的話,可以把Spring的jar包放到 common 或 shared 目錄下讓這些程序共享。Spring 的作用是管理每個web應(yīng)用程序的bean,getBean時自然要能訪問到應(yīng)用程序的類,而用戶的程序顯然是放在 /WebApp/WEB-INF 目錄中的(由 WebAppClassLoader 加載),那么在 CommonClassLoader 或 SharedClassLoader 中的 Spring 容器如何去加載并不在其加載范圍的用戶程序(/WebApp/WEB-INF/)中的Class呢?
spring加載解答spring根本不會去管自己被放在哪里,它統(tǒng)統(tǒng)使用線程上下文加載器來加載類,而線程上下文加載器默認設(shè)置為了WebAppClassLoader,也就是說哪個WebApp應(yīng)用調(diào)用了spring,spring就去取該應(yīng)用自己的WebAppClassLoader來加載bean。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/69572.html
摘要:第章內(nèi)存區(qū)域與內(nèi)存溢出異常運行時數(shù)據(jù)區(qū)域虛擬機在執(zhí)行程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。即對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。 第2章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常 2.2 運行時數(shù)據(jù)區(qū)域 Java虛擬機在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。根據(jù)《Java虛擬機規(guī)范(Java SE 7版)...
摘要:作用負責(zé)將加載到中審查每個類由誰加載父優(yōu)先的等級加載機制將字節(jié)碼重新解析成統(tǒng)一要求的對象格式類結(jié)構(gòu)分析為了更好的理解類的加載機制,我們來深入研究一下和他的方法。就算兩個是同一份字節(jié)碼,如果被兩個不同的實例所加載,也會認為它們是兩個不同。 申明:本文首發(fā)于 詳細深入分析 ClassLoader 工作機制 ,如有轉(zhuǎn)載,注明原出處即可,謝謝配合。 什么是 ClassLoader ? 大家...
摘要:示例如下動態(tài)類重新加載動態(tài)類重新加載有一些挑戰(zhàn)。為了上面代碼的正常運行,你當(dāng)然需要實現(xiàn)自己的類加載器,讓接口或超類由其父類加載。 Java中可以在運行時加載和重新加載類,雖然并不像我們想像中那么簡單。本文將解釋何時、怎樣在Java中加載、重新加載類。你可以爭論動態(tài)加載類是Java反射的一部分還是Java核心的一部分。不管怎樣,我把它放在了Java反射中,因為沒有更好的地方放置它。 類加...
摘要:當(dāng)前類加載器和所有父類加載器都無法加載該類時,拋出異常。加載兩份相同的對象的情況和不屬于父子類加載器關(guān)系,并且各自都加載了同一個類。類加載機制與接口當(dāng)虛擬機初始化一個類時,不會初始化該類實現(xiàn)的接口。 類加載機制 概念 類加載器把class文件中的二進制數(shù)據(jù)讀入到內(nèi)存中,存放在方法區(qū),然后在堆區(qū)創(chuàng)建一個java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)。 1、加載: 查...
閱讀 3175·2021-09-22 15:54
閱讀 4099·2021-09-09 11:34
閱讀 1836·2019-08-30 12:48
閱讀 1223·2019-08-30 11:18
閱讀 3516·2019-08-26 11:48
閱讀 980·2019-08-23 17:50
閱讀 2183·2019-08-23 17:17
閱讀 1314·2019-08-23 17:12