Tomcat的類加載器
在啓動Tomcat時,它將創建一組類加載器,並被組織爲以下父子關係。
類加載器使用順序
Tomcat爲了實現一個基本的web容器,需要保證以下四點:
- 一個容器中的不同應用程序之間的類可以相互隔離,也就是就算全限定名相同的兩個類加載出來也需要是不一樣的。
- 一個容器中的不同應用程序之間可以互相共享類,也就是對於相同的類可以共享使用。
- 對於容器的內部類,需要與應用程序隔離開,也就是應用程序不能使用容器的內部類,以保證容器的安全。
- JSP需要熱部署,也就是當jsp文件改動時,類加載器能重新加載這個jsp編譯出來的類。
默認Tomcat內部的類加載器不使用Java推薦的雙親委派模型。但是這個跟上面那要求沒有關係,違反雙親委派只是根據servlet規範中的建議:處理webAPP的類加載器的類加載請求時,不是向上委派,而是直接用這個加載器加載。但是對於Java的基類(rt.jar中的所有類和$JAVA_HOME/jre/lib/ext目錄下所有jar包中的類)不受到影響,Java基類還是按照雙親委派機制來加載類,所以在Tomcat中重寫一個Java基類是不會被運行成功的,即使能編譯成功。
所以Tomcat中類加載器的使用順序如下,默認優先使用應用程序類加載器
- JVM的Bootstrap類,首先加載Java基類
- 使用應用加載器在/WEB-INF/classes中加載src下的所有壓縮類和資源(也就是用戶編寫的類)
- 使用應用加載器在/WEB-INF/lib中加載jar文件中的類和資源(也就是引入的外部的類)
- 使用System類加載器加載
- 使用Common類加載加載
但是如果配置了Loader的delegate屬性爲true,那麼Tomcat內部的類加載器將遵循Java的雙親委派模型,所以順序將爲如下:
- JVM的Bootstrap類,首先加載Java基類
- 使用System類加載器加載
- 使用Common類加載加載
- 使用應用加載器在/WEB-INF/classes中加載src下的所有壓縮類和資源(也就是用戶編寫的類)
- 使用應用加載器在/WEB-INF/lib中加載jar文件中的類和資源(也就是引入的外部的類)