有時候面試時會被問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上查看代碼片派生到個人代碼片 /**架構
// 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,那麼就是按照配置參數默認從小到大排列啓動。