做
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
来实现初始化和方法调用的
,
这样可以使服务器的实现类很容易被替换,降低耦合性,减少将来代码的改动,的确是一种优秀的设计模式思想。