tomcat 源碼分析(二)類加載體系

Java虛擬機規(guī)范中提到的主要類加載器:

Bootstrap Loader:加載lib目錄下或者System.getProperty(“sun.boot.class.path”)、或者-XBootclasspath所指定的路徑或jar。

Extended Loader:加載lib\ext目錄下或者System.getProperty(“java.ext.dirs”) 所指定的 路徑或jar。在使用Java運行程序時,也可以指定其搜索路徑,例如:java -Djava.ext.dirs=d:\projects\load\classes HelloWorld。

AppClassLoader:加載System.getProperty("java.class.path")所指定的 路徑或jar。在使用Java運行程序時,也可以加上-cp來覆蓋原有的Classpath設置,例如: java -cp ./load/classes HelloWorld

tomcat 實現(xiàn)了基于自身的類加載體系如下:


類加載體系進行介紹:

ClassLoader:Java提供的類加載器抽象類,用戶自定義的類加載器需要繼承實現(xiàn);

commonLoader:Tomcat最基本的類加載器,加載路徑中的class可以被 Tomcat 容器本身以及各個Webapp訪問;

catalinaLoader:Tomcat容器私有的類加載器,加載路徑中的class對于Webapp不可見;

sharedLoader:各個Webapp共享的類加載器,加載路徑中的class對于所有Webapp可見,但是對于Tomcat容器不可見;

WebappClassLoader:各個Webapp私有的類加載器,加載路徑中的class只對當前Webapp可見。

源碼分析:

commonLoader、catalinaLoader和sharedLoader是在Tomcat容器初始化的的過程剛剛開始,即調(diào)用Bootstrap的init方法時創(chuàng)建的。catalinaLoader會被設置為Tomcat主線程的線程上下文類加載器,并且使用catalinaLoader加載Tomcat容器自身的class。Bootstrap的init方法的部分如代碼清單1所示。

類加載器的執(zhí)行步驟如下:

初始化commonLoader、catalinaLoader和sharedLoader;

將catalinaLoader設置為Tomcat主線程的線程上下文類加載器;

線程安全的加載class。

初始化類加載器分析:

initClassLoaders方法的實現(xiàn)如代碼如下:

可以看到initClassLoaders調(diào)用createClassLoader方法來創(chuàng)建commonLoader、catalinaLoader和sharedLoader,我們來看看createClassLoader的實現(xiàn);見如下代碼:


createClassLoader的處理步驟如下:

定位資源路徑與資源類型;

使用ClassLoaderFactory創(chuàng)建類加載器org.apache.catalina.loader.StandardClassLoader。

需要注意的是,Tomcat默認只會指定commonLoader(通過common屬性,默認值為catalina.base/lib,catalina.base/lib,{catalina.base}/lib/*.jar,catalina.home/lib,catalina.home/lib,{catalina.home}/lib/*.jar),catalinaLoader和sharedLoader實際也是commonLoader。屬性catalina.home默認為Tomcat的根目錄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容