1. 一切从main方法开始
以main方法作为程序的起点,这可以说是大多数语言的惯例。上文已介绍了,Tomcat的启动main方法在“java/org/apache/catalina/startup/Bootstrap.java”文件中。那么我们就以这个Bootstrap类作为源码阅读的起点。
Bootstrap类的注释翻译如下:
Bootstrap类是Catalina 的引导加载程序。
该应用程序构建了一个类加载器,用于加载 Catalina 内部类(通过累积在“catalina.home”下的“server”目录中找到的所有 JAR 文件),并启动容器的常规执行。
这种迂回方法的目的是将 Catalina 内部类(以及它们所依赖的任何其他类,例如 XML 解析器)保留在系统类路径之外,因此对应用程序级类不可见。
这涉及到了此类中的两个重要变量(下文会用到):
/** * daemon: main方法使用的守护进程对象. */ private static volatile Bootstrap daemon = null; /** * 守护程序引用的catalina对象。 */ private Object catalinaDaemon = null;
一个是Bootstrap类型的守护进程,另一个则是Catalina ,Tomcat的核心。
但Tomcat并没有直接创建它,而是通过一个Bootstrap类型的守护程序来创建和初始化Catalina ,并管理其启动、停止等。
2. 源码分析心得
用快捷键“ctrl+shift+加号”键折叠所有代码,先整体看一下Bootstrap类的方法的层级关系,通过方法名、注释等简要了解方法的作用。
简要画一下关系图,类似这样:
以上图为例,代码是逐级细化的,就像看地图一样,首先看到的是整个地球,放大一下,也就是进入了下一个层级,可以看到所有国家。针对某个国家再放大,可以看到相应的省。通过这样先整体后局部的方式把握整体层级架构,然后再按需分析一些主要的方法。在调试的时候,首先尽量少Step Into,了解完本级的大概功能后,再按需求进入子方法阅读。
然后,要明确自己的目的。了解的方法的大概作用后,就要根据自己的目的进行取舍。例如此处的replace方法,已知道它的作用是替换属性中的占位符。
如果是想了解框架的关键流程,一些细枝末节的辅助方法就简要过一下就行了,这样的replace方法知道作用就可以跳过了;
如果想学习框架的代码技巧、算法、或者验证某功能的实现机制等,可以深入的分析一下,配合逐步调试。
按程序的执行流程来说,是对上图这棵树进行深度优先遍历的过程。但从源码分析角度,建议通过广度优先的方式,逐级进行分析。