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

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

3.1 创建类加载器

首先通过initClassLoaders()方法创建了三个类加载器,对应为以下的三个变量赋值:

ClassLoader commonLoader = null;
ClassLoader catalinaLoader = null;
ClassLoader sharedLoader = null;

对应的配置在conf/catalina.properties文件中,配置如下

common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar"
server.loader=
shared.loader=

common.loader是另外两个类的父级,默认情况下,server.loader和shared.loader未作配置,返回结果同common.loader。

3.2 创建并初始化catalinaDaemon

在init()的后半部分,通过反射方式根据"org.apache.catalina.startup.Catalina"创建了Catalina对象,并调用其“setParentClassLoader”方法将sharedLoader赋值给它的parentClassLoader属性。


为什么要通过反射的方式来进行创建?


Bootstrap类的注释已经说明,主要是为了类的隔离。但这也导致了调用Catalina对象的方法也需要通过getMethod的方法获取并调用。

4. 控制Tomcat的启动状态

main方法的后半部分,通过传进来的arg值来确定执行的操作

String command = "start";
if (args.length > 0) {
    command = args[args.length - 1];
}
if (command.equals("startd")) {
    args[args.length - 1] = "start";
    daemon.load(args);
    daemon.start();
} else if (command.equals("stopd")) {
    args[args.length - 1] = "stop";
    daemon.stop();
} else if (command.equals("start")) {
    daemon.setAwait(true);
    daemon.load(args);
    daemon.start();
    if (null == daemon.getServer()) {
        System.exit(1);
    }
} else if (command.equals("stop")) {
    daemon.stopServer(args);
} else if (command.equals("configtest")) {
    daemon.load(args);
    if (null == daemon.getServer()) {
        System.exit(1);
    }
    System.exit(0);
} else {
    log.warn("Bootstrap: command \"" + command + "\" does not exist.");
}

arg是调用tomcat传的参数,若未传则默认是“start”,根据这个命令来控制tomcat的状态。

看起来简单的start、stop方法,背后的逻辑比较复杂,下文单独作为一个专题讲解。

目录
相关文章
|
2月前
|
设计模式 算法 前端开发
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管理各种组件的行为和生命期。
8 0
|
11月前
|
XML 应用服务中间件 数据格式
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段三_start阶段
63 0
|
11月前
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段二_load加载初始化
75 0
|
11月前
|
前端开发 Java 应用服务中间件
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap
76 0
|
存储 XML Java
Tomcat启动过程原理详解
Tomcat启动过程原理详解
96 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的启动为起点,开启源码学习之旅。
517 0
拆解Tomcat10: (三) 图解Tomcat的启动过程(二)
|
XML 前端开发 算法
拆解Tomcat10: (三) 图解Tomcat的启动过程(一)
上一篇介绍了如何在Idea中下载并调试最新的Tomcat的源码(已更新到2021.12.8日发布的Tomcat 10.0.14)。如果说Tomcat是一部处理请求的机器,想了解Tomcat是如何处理请求的,首先要了解它的内部结构,本章以Tomcat的启动为起点,开启源码学习之旅。
321 0
拆解Tomcat10: (三) 图解Tomcat的启动过程(一)
|
Java 应用服务中间件 Spring
SpringBoot内嵌tomcat启动过程
SpringBoot内嵌tomcat启动过程
173 0