對於Tomcat類加載器的一點思考

Tomcat的類加載器

在啓動Tomcat時,它將創建一組類加載器,並被組織爲以下父子關係。
image.png

類加載器使用順序

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文件中的類和資源(也就是引入的外部的類)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章