做
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
來實現初始化和方法調用的
,
這樣可以使服務器的實現類很容易被替換,降低耦合性,減少將來代碼的改動,的確是一種優秀的設計模式思想。