Servlet容器的啟動過程。
阿新 • • 發佈:2019-01-08
Tomcat的啟動邏輯是基於觀察者模式設計的,所有的容器都會繼承Lifecycle介面,他管理著容器的整個生命週期,所有容器的修改和狀態的改變都會由他去通知已經註冊的觀察者(Listener)。Tomcat啟動的時序圖如下圖所示。
上圖描述了在Tomcat的啟動過程中主要類之間的時序關係,下面我們將會重點關注新增examples應用所對應的StandardContext容器的啟動過程。
當Context容器初始化狀態設為init時,新增到Context容器的Listener將會被呼叫。ContextConfig繼承了LifecycleListener介面,他是在呼叫Tomcat.addWebapp時被加入到StandardContext容器中的。ContextConfig類會負責整個Web應用的配置檔案的解析工作。
ContextConfig的init方法將會主要完成以下工作。
- 建立用於解析XML配置檔案的contextDigester物件。
- 讀取預設的context.xml配置檔案,如果存在則解析它。
- 讀取預設的Host配置檔案,如果存在則解析他。
- 讀取預設的Context自身的配置檔案,如果存在則解析他。
- 設定Context的DocBase。
ContextConfig的init方法完成後,Context容器就會執行startInternal方法,這個方法的啟動邏輯比較複雜,主要包括如下幾部分。
- 建立讀取資原始檔的物件。
- 建立ClassLoader物件。
- 設定應用的工作目錄。
- 啟動相關的輔助類,如logger、realm、resources等。
- 修改啟動狀態,通知感興趣的觀察者(Web應用的配置)。
- 子容器的初始化。
- 獲取ServletContext並設定必要的引數。
- 初始化“load on startup”的Servlet。