Tomcat源碼分析——啓動過程

一直使用Tomcat確不知道它的運行原理。看了源碼後對它的啟動過程有了一定的瞭解,特來記錄一下。

首先先介紹一下Tomcat的架構圖:

Tomcat源碼分析——啟動過程

Tomcat主要有兩個核心的組件,一個是Connector(連接器)和容器。所謂連接器就是當有HTTP請求到來時,連接器負責接收這個請求,然後將該請求轉發到容器。容器有Engine,Host,Context,Wrapper。Engine:表示整個Catalina servlet引擎;Host:表示包含一個或多個Context容器的虛擬主機;Context:表示一個Web應用程序。一個Context可以有多個Wrapper;Wrapper:表示一個獨立的servlet。一個容器可以有0個或多個低層級的子容器。例如,一般情況下,一個Context實例會有一個或多個Wrapper實例。一個Host實例中會有0個或多個Context實例。但是,Wrapper類型處於層級結構的最底層,因此,它無法再包含子容器了。

一般啟動Tomcat會是運行startup.bat或者startup.sh文件,這兩個文件最後都會調用,org.apache.catalina.startup包下面Bootstrap類的main方法。main方法具體實現如下:

Tomcat源碼分析——啟動過程

main方法先實例化了一個Bootstrap實例,接著調用了init方法。init方法是生命週期方法,以後不再累述。接著看init的具體實現。

Tomcat源碼分析——啟動過程

init方法,先初始化了類加載器。initClassLoaders方法具體實現如下:

Tomcat源碼分析——啟動過程

createClassLoader具體實現細節不再顯示,有感興趣的讀者可以具體查看。該方法的具體簽名為:

  • 1 private ClassLoader createClassLoader(String name, ClassLoader parent) throws Exception

從方法簽名中可以看出createClassLoader需要傳入一個父加載器。從具體的代碼中可以看出,commonLoader類加載器是catalinaLoader類加載器和sharedLoader類加載器的父加載器。初始化完類加載器後,使用反射機制調用org.apache.catalina.startup.Catalina類下的setParentClassLoader方法。具體代碼是:

Tomcat源碼分析——啟動過程

因為Tomcat執行的是start操作,調用完init方法後,會執行load方法。

Tomcat源碼分析——啟動過程

load方法通過反射調用Catalina類的load方法。

Tomcat源碼分析——啟動過程

Catalina類的load方法:

Tomcat源碼分析——啟動過程

load方法中比較重要的方法是createStartDigester(),createStartDigester方法主要的作用就是幫我們實例化了所有的服務組件包括server,service和connect。具體的實例化方法,

Tomcat源碼分析——啟動過程

初始化操作完成後,接下來會執行catalina實例的start方法。

從上面加載的組件中,Tomcat會默認加載org.apache.catalina.core.StandardServer作為Server的實例類。

Tomcat源碼分析——啟動過程

在Server的start的方法裡面會執行service的start方法。在createStartDigester()方法裡面,會默認加載org.apache.catalina.core.StandardService類。會接著調用Service的start方法。

Tomcat源碼分析——啟動過程

service中會調用connector的start方法。至此Tomcat啟動完畢

Tomcat源碼分析——啟動過程


分享到:


相關文章: