tomcat加載web.xml的順序

有時候面試時會被問tomcat啓動時web.xml中節點(相似listener,filter等)被加載的順序,死記硬背那多沒品,正好手裏有tomcat7的源碼,找了點時間翻了翻。java

讓咱們先來喵一眼tomcat的架構,大體瞭解下tomcat啓動的順序,那咱們目前關心的僅僅是web.xml中的加載順序,按照架構來說確定是在Context中,架構以下圖:web

TomcatArchitecture from http://imtiger.net/面試

在此輸入圖片描述

那咱們就來到Context中尋找線索,按照tomcat架構設計Context的實現類是StandardContext,全稱org.apache.catalina.core.StandardContextapache

看到其實現Lifecycle接口,咱們在StandardContext中笑而不語的找到startInternal方法,看看我把暫時無語的代碼去掉後的註釋版tomcat

[java] view plaincopy在CODE上查看代碼片派生到個人代碼片 /**架構

  • Start this component and implement the requirements
  • of {@link org.apache.catalina.util.LifecycleBase#startInternal()}.
  • @exception LifecycleException if this component detects a fatal error
  • that prevents this component from being used */
    @Override
    protectedsynchronized void startInternal() throwsLifecycleException {
    //設置webappLoader 代碼省略

// Standard container startup 代碼省略app

try{webapp

// Set up the context init params 初始化context-param節點數據
mergeParameters();ide

// Configure and call application event listeners
//配置和調用listeners 也就是說開始監聽
if(ok) {
if(!listenerStart()) {
log.error("Error listenerStart");
ok = false;
}
}ui

// Configure and call application filters
//配置和調用filters filters開始起做用
if(ok) {
if(!filterStart()) {
log.error("Error filterStart");
ok = false;
}
}

// Load and initialize all "load on startup" servlets
//加載和初始化配置在load on startup的servlets
if(ok) {
loadOnStartup(findChildren());
}

// Start ContainerBackgroundProcessor thread
super.threadStart();
}finally{
// Unbinding thread
unbindThread(oldCCL);
}

}
因此代碼就是最好的文檔就是這樣,咱們概括一下代碼

1:首先是context-param節點

2:接着配置和調用listeners 並開始監聽

3:而後配置和調用filters filters開始起做用

4:最後加載和初始化配置在load on startup的servlets

另外贈送一枚彩蛋,也就是load on startup中的啓動順序是按照配置參數從小到大加載實例化的(小於0的忽略),

源代碼中是用一個TreeMap,其中鍵爲Integer,那麼就是按照配置參數默認從小到大排列啓動。

相關文章
相關標籤/搜索