Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap

简介: Tomcat - Tomcat 8.5.55 启动过程源码分析阶段一_init实例化Bootstrap

20200524232834382.png

Pre

上篇我们搭建了tomcat的源码环境: Tomcat - 源码构建Tomcat 8.5.55 启动

接下来我们来分析一下tomcat的启动过程。


回忆一下 tomcat的架构图


20200524234428508.png


Tomcat启动的时候肯定要把架构中提到的组件进行实例化(实例化创建–>销毁等:生命周期)。

Tomcat中那么多组件,为了统一规范他们的生命周期,Tomcat抽象出了LifeCycle生命周期接口 。


生命周期统一管理组件LifeCycle


2020052815113948.png

查看LifeCycle的实现类 Hierarchy, 快捷键 Ctrl + H


20200528151835174.png


是不是就和刚才架构中的组件对应上了?


启动入口类查找

我们一linux操作系统为例,我们启动tomcat都是执行 startup.sh 对吧

都是shell, 不难


20200528161615317.png


继续 catalina.sh start


20200528161741171.png


到最后其实是执行了 java xxxx.jar org.apache.catalina.startup.Bootstrap(main) start(参数)

那就看Bootstrap的main方法吧


启动流程分析

启动总览


20200530135838330.png


20200528164120805.png



骨干脉络清楚了 ,看下具体实现咯


init 实例化 Bootstrap

从 Bootstrap#main() 进去 ,为了关注核心流程,精简了一下

  private static volatile Bootstrap daemon = null;
  Bootstrap bootstrap = new Bootstrap();
  bootstrap.init();
  daemon = bootstrap;


init 干了啥 ?

  /**
     * Initialize daemon.
     * @throws Exception Fatal initialization error
     */
    public void init() throws Exception {
        // 初始化类加载器
        initClassLoaders();
        // 设置类加载器
        Thread.currentThread().setContextClassLoader(catalinaLoader);
        SecurityClassLoad.securityClassLoad(catalinaLoader);
        // load org.apache.catalina.startup.Catalina
        Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
        // 实例化Catalina
        Object startupInstance = startupClass.getConstructor().newInstance();
        // 方法名
        String methodName = "setParentClassLoader";
        // 参数
        Class<?> paramTypes[] = new Class[1];
        paramTypes[0] = Class.forName("java.lang.ClassLoader");
        Object paramValues[] = new Object[1];
        paramValues[0] = sharedLoader;
        //  获取方法
        Method method =
            startupInstance.getClass().getMethod(methodName, paramTypes);
        // 方法调用
        method.invoke(startupInstance, paramValues);
        // 对象赋值
        catalinaDaemon = startupInstance;
    }



是不是很熟悉? 通过反射调用 org.apache.catalina.startup.Catalina#setParentClassLoader 方法 ,最后 catalinaDaemon = startupInstance; 赋值 , 事实上 后面调用的load 和 start方法 均为Catalina对象的load和start 方法。

相关文章
|
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管理各种组件的行为和生命期。
16 0
|
2月前
|
XML Java 应用服务中间件
SpringBoot配置外部Tomcat项目启动流程源码分析(长文)
SpringBoot配置外部Tomcat项目启动流程源码分析(长文)
115 0
|
12月前
|
存储 缓存 前端开发
07.Tomcat源码分析——类加载体系
由于在生产环境中,Tomcat一般部署在Linux系统下,所以本文将以 startup.sh shell脚本为准,对Tomcat的启动进行分析。
36 0
07.Tomcat源码分析——类加载体系
|
前端开发 Java 应用服务中间件
TOMCAT 源码分析 -- 一次请求
TOMCAT 源码分析 -- 一次请求
73 0
|
Java 应用服务中间件
TOMCAT 源码分析 -- 构建环境
TOMCAT 源码分析 -- 构建环境
81 0
|
监控 前端开发 Java
TOMCAT 源码分析 -- 启动(下)
TOMCAT 源码分析 -- 启动
75 0
|
XML 前端开发 Java
TOMCAT 源码分析 -- 启动(上)
TOMCAT 源码分析 -- 启动
113 0
|
Java 应用服务中间件 容器
Tomcat源码分析之中文乱码(一)
Tomcat源码分析之中文乱码(一)
147 0
|
Java 应用服务中间件 容器
Tomcat源码分析----一个http请求的经历
本章节对http请求到tomcat服务端,从监听到处理过程展现给大家。
12835 0