Tomcat源碼分析(一)

J2EE 開源項目也有幾年時間了,對於J2EE開源技術一直都是拿來主義,知道如何去配置、去使用,掌握的都是一些皮毛,知其然不知其所以然。所以想通過分析一些成熟的開源軟件源碼,讓自己在J2EE開源領域有一個質的飛躍。分析源碼一方面可以從根本上掌握開源軟件的設計原理和實現方法,另一方面可以學到更多的開源技術和架構思想。以前有 什麼技術難點都是從開源社區去尋求幫助,現在通過分析研究 Tomcat 源碼,把分析的結果以及所得總結出來,也爲 J2EE 開源社區出一份力。

  版本是 Tomcat-6.0.18, 是在 windows 配置環境下,具體下載源碼我就不說了,直接從 Tomcat 啓動開始,從現在起我會堅持把 Thomat 開源分析寫完,做到有始有終, 寫得不妥之處,還請大家及時指正

我們啓動 tomcat 一般都是通過命令行 catalina run/catalina start/startup ,可以通過 cmd 下的輸入命令或者建立一個 bat 批處理文件,調用這些命令,歸根結底最後還是通過 java Bootstrap start 命令執行 Bootstrap 程序。當然啓動之前可以在 catalina.properties 或者 catalina.bat 中配置相應的啓動參數以達到分 配內存或者 debug 等目的。下面我們就從 Bootstrap 類開始 Tomcat 源碼分析旅途吧。


>>>>>>>>>>
org.apache.catalina.startup.Bootstrap.java <<<<<<<<<<

   Bootstrap 類的主要作用就是初始化 ClassLoader, 然後就是利用 Java Reflection 調用 Catalina 類來達到啓動 tomcat server 的目的 ,Bootstrap 類似於導火線,也就是 tomcat 啓動的前奏。因爲上面提過啓動 Tomcat 是通過 java 命令,所以執行的起點就是 bootstrap 類的中的 main() 開始。

程序執行流程中相關代碼說明如下:

1.daemon.init();
  執行初始化工作,設定系統變量、初始化 ClassLoader ,以及通過 reflection 構造 Catalina 的實例 Class startupClass =
catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
Object startupInstance = startupClass.newInstance();

catalinaDaemon = startupInstance;
//
實例賦給 catalinaDarmon 變量
 

2.
我們是以 catalina start 運行 Tomcat, 參數是 start ,執行如下代碼:
   
daemon.setAwait(true);
    daemon.load(args);
    daemon.start();

  setAwait(true) 是設定服務器啓動後進行會進入等待中斷命令的狀態,當有Ctrl+C動作發生時,就會停止服務器
 
3.240
行: private void load(String[] arguments) 是用 reflection 調用 catalinaDaemon.load()(catalinaDaemon Catalina 類的實體 ), server 啓動之前進行初始化工作。

4.283
行: public void start() , 也是用反射機制調用 Catalina 中的 start() 方法,從而啓動 Tomcat 服務器, Catalina 會在下一遍中進行分析說明。
    Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
    method.invoke(catalinaDaemon, (Object [])null);


總結: Bootstrap 類還是很簡單明瞭的,其中很多地方用了反射,調用 Catalina 中的方法都是通過 reflection 來實現初始化和方法調用的 , 這樣可以使服務器的實現類很容易被替換,降低耦合性,減少將來代碼的改動,的確是一種優秀的設計模式思想。

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章