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