圣融網(wǎng)站建設(shè)如何推廣一個平臺
不遵循雙親委托
??在JVM中并不是一次性地把所有的文件都加載到,而是按需加載,加載機制采用 雙親委托原則,如下圖所示:
- BootStrapClassLoader 引導(dǎo)類加載器
- ExtClassLoader 擴展類加載器
- AppClassLoader 應(yīng)用類加載器
- CustomClassLoader 用戶自定義類加載器
??類的加載過程是這樣的: 用戶自己的類加載器,把加載請求傳給父加載器,父加載器再傳給其父加載器,一直到加載器樹的頂層; 最頂層的類加載器首先針對其特定的位置加載,如果加載不到就轉(zhuǎn)交給子類;如果一直到底層的類加載都沒有加載到,那么就會拋出異常ClassNotFoundException
??因此,按照這個過程可以想到,如果同樣在CLASSPATH指定的目錄中和自己工作目錄中存放相同的class,會優(yōu)先加載CLASSPATH目錄中的文件。
??Tomcat的類加載機制是違反了雙親委托原則的,對于一些未加載的非基礎(chǔ)類(Object,String等),各個web應(yīng)用自己的類加載器(WebAppClassLoader)會優(yōu)先加載,加載不到時再交給CommonClassLoader走雙親委托。對于標(biāo)準(zhǔn)類庫中的類,會讓系統(tǒng)類加載器加載,然后一直委托到啟動類加載器,這個過程是沒有違背雙親委派的。
Tomcat 的類加載機制
??啟動類加載器(Bootstrap) 和 擴展類加載器 (Extension ClassLoader),Application ClassLoader(應(yīng)用程序類加載器),這三個類加載和默認的一致。CommonClassLoader、CatalinaClassLoader、SharedClassLoader和WebappClassLoader則是Tomcat自己定義的類加載器。
- CommonClassLoader: Tomcat最基本的類加載器,加載路徑中的class可以被Tomcat容器本身以及各個Webapp訪問;位于CATALINA_HOME/lib下,?如servlet-api.jar;
- CatalinaClassLoader:Tomcat容器私有的類加載器,加載路徑中的class對于Webapp不可見;
- SharedClassLoader:?于加載應(yīng)?程序共享類,這些類服務(wù)器不會依賴,加載路徑中的class對于所有Webapp可見,但是對于Tomcat容器不可見;
- WebappClassLoader:每個應(yīng)用在部署后,都會創(chuàng)建一個唯一的類加載器,?來加載本應(yīng)?程序 /WEB-INF/classes 和 /WEB-INF/lib 下的類。
??當(dāng)應(yīng)用需要到某個類時,則會按照下面的順序進行類加載:
- 使用bootstrap引導(dǎo)類加載器加載【一般為JVM啟動所需的類,以及標(biāo)準(zhǔn)擴展類,位于jre/lib/ext】
- 使用系統(tǒng)類加載器加載【加載tomcat啟動的類,比如bootstrap的類】
- 使用應(yīng)用類加載器在WEB-INF/classes中加載
- 使用應(yīng)用類加載器在WEB-INF/lib中加載
- 使用common類加載器在CATALINA_HOME/lib中加載