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的根目錄。