拆解Tomcat10: (三) 图解Tomcat的启动过程(一)

简介: 上一篇介绍了如何在Idea中下载并调试最新的Tomcat的源码(已更新到2021.12.8日发布的Tomcat 10.0.14)。如果说Tomcat是一部处理请求的机器,想了解Tomcat是如何处理请求的,首先要了解它的内部结构,本章以Tomcat的启动为起点,开启源码学习之旅。

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类的方法的层级关系,通过方法名、注释等简要了解方法的作用。


简要画一下关系图,类似这样:

55.png

以上图为例,代码是逐级细化的,就像看地图一样,首先看到的是整个地球,放大一下,也就是进入了下一个层级,可以看到所有国家。针对某个国家再放大,可以看到相应的省。通过这样先整体后局部的方式把握整体层级架构,然后再按需分析一些主要的方法。在调试的时候,首先尽量少Step Into,了解完本级的大概功能后,再按需求进入子方法阅读。


然后,要明确自己的目的。了解的方法的大概作用后,就要根据自己的目的进行取舍。例如此处的replace方法,已知道它的作用是替换属性中的占位符。


如果是想了解框架的关键流程,一些细枝末节的辅助方法就简要过一下就行了,这样的replace方法知道作用就可以跳过了;

如果想学习框架的代码技巧、算法、或者验证某功能的实现机制等,可以深入的分析一下,配合逐步调试。

按程序的执行流程来说,是对上图这棵树进行深度优先遍历的过程。但从源码分析角度,建议通过广度优先的方式,逐级进行分析。


目录
相关文章
|
2月前
|
人工智能 前端开发 Java
【Tomcat源码分析】启动过程深度解析 (二)
本文深入探讨了Tomcat启动Web应用的过程,重点解析了其加载ServletContextListener及Servlet的机制。文章从Bootstrap反射调用Catalina的start方法开始,逐步介绍了StandardServer、StandardService、StandardEngine、StandardHost、StandardContext和StandardWrapper的启动流程。每个组件通过Lifecycle接口协调启动,子容器逐层启动,直至整个服务器完全启动。此外,还详细分析了Pipeline及其Valve组件的作用,展示了Tomcat内部组件间的协作机制。
【Tomcat源码分析】启动过程深度解析 (二)
|
6月前
|
设计模式 算法 前端开发
Tomcat的源码剖析, 启动过程你会吗?
基于JMX Tomcat会为每个组件进行注册过程,通过Registry管理起来,而Registry是基于JMX来实现的,因此在看组件的init和start过程实际上就是初始化MBean和触发MBean的start方法,会大量看到形如: Registry.getRegistry(null, null).invoke(mbeans, "init", false); Registry.getRegistry(null, null).invoke(mbeans, "start", false); 这样的代码,这实际上就是通过JMX管理各种组件的行为和生命期。
36 0
|
XML 应用服务中间件 数据格式
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
105 0
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
97 0
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
103 0
|
存储 XML Java
Tomcat启动过程原理详解
Tomcat启动过程原理详解
107 0
|
Java 应用服务中间件 容器
面试官:来说说Tomcat的启动过程是什么样子的(下)
阿粉最近在疯狂的研究各种用的工具里面的源码实现,之前给大家都专门的去扣了一下 JDK 里面自带的exe程序,这次阿粉开始更加无聊,直接开始搞Tomcat。
面试官:来说说Tomcat的启动过程是什么样子的(下)
|
前端开发 Java 应用服务中间件
面试官:来说说Tomcat的启动过程是什么样子的(上)
阿粉最近在疯狂的研究各种用的工具里面的源码实现,之前给大家都专门的去扣了一下 JDK 里面自带的exe程序,这次阿粉开始更加无聊,直接开始搞Tomcat。
面试官:来说说Tomcat的启动过程是什么样子的(上)
|
前端开发 Java 应用服务中间件
拆解Tomcat10: (三) 图解Tomcat的启动过程(二)
上一篇介绍了如何在Idea中下载并调试最新的Tomcat的源码(已更新到2021.12.8日发布的Tomcat 10.0.14)。如果说Tomcat是一部处理请求的机器,想了解Tomcat是如何处理请求的,首先要了解它的内部结构,本章以Tomcat的启动为起点,开启源码学习之旅。
550 0
拆解Tomcat10: (三) 图解Tomcat的启动过程(二)
|
前端开发 应用服务中间件
拆解Tomcat10: (三) 图解Tomcat的启动过程(三)
上一篇介绍了如何在Idea中下载并调试最新的Tomcat的源码(已更新到2021.12.8日发布的Tomcat 10.0.14)。如果说Tomcat是一部处理请求的机器,想了解Tomcat是如何处理请求的,首先要了解它的内部结构,本章以Tomcat的启动为起点,开启源码学习之旅。
432 0