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