当tomcat启动的时候 首先会加载 org.apache.ctalina.startup.BootStrap类。 使用eclipse或idea启动tomcat其实就是在启动这个类的main方法

根据类的初始化 首先会 加载static静态块 然后进入main方法。

启动的主要步骤可以围绕BootStrap划分为 static中的 准备 和main中的初始化(init)、加载 (load)、启动(statrt)

1、 static

static静态块中做的事情是获取tomcat 的安装目录和创建catalina工作目录 ,为tomcat 的启动做准备

 catalina: catalina目录 在/work 目录下 ,是tomcat 的工作目录 在tomcat启动的时候被创建 , 负责存放项目中被编译后jsp文件 ,jsp即servlet ,默认当请         求首先请求jsp时 ,会将 webapps目录下            的.jsp 编译成.class文件

 2、main

  

  main方法主要是 init、laod、start  (daemon = bootStrap),当start 方法加载完毕 ,就标志着tomcat启动完成  下面看这三步做了哪些事情

  (1)init

    

初始化类加载器ClassLoader (ClassLoader负责将 .class 加载到jvm方法区进行类的初始化) 这里ClassLoader主要是加载Catalina.class

     Catalina 类: 是真正用于 初始化、启动tomcat 的类, 当运行到 BootStrap的main中的laod、start方法时 , 会通过反射 动态的加载 Catalina类 中的 load、start方法 ,

这也是为 什么init  中会先 获取类加载器 ,目的是 通过ClassLoader 实例化Catalina对象 ,为load和start做准备

   这里具体加载Catalina类的是CatalinaClassLoader ,重写了 java的ApplicationClassLoader ,目的是为了打破 ClassLoader双亲委派机制提高性能

  (2)laod :比较复杂 ,涉及server、service、connector、engin、可分为如下几步  注意:load过程中并且有对 host、wapper 进行初始化 

    

    A、Bootstrap.load(args);  :通过反射调用Catalina的load方法 ,然后catalina的load方法来通过Degister解析器解析server.xml来创建一个server对象,然后在通过set方法为server设置属性 
  B、然后getServer().init(); 对server进行初始化
  C、在初始化时再调用StandardServer的initInternal方法调用services[i].init();(service可能存在多个)对service进行初始化
   D、在初始化时再调用StandardService的initInternal方法中调用engine.init();对engine初始化
   E、在初始化时再调用StandardEngine的initInternal方法进行调用getRealm()对进行安全设置域和调用父类的initInternal创建启停的线程池;接着启动线程池,
   F、初始化Connector ,然后调用Connector 的initInternal方法 初始化CoyoteAdapter适配器 、然后调用protocolHandler.init();
    G、进行protocolHandler的初始化,由于是protocolHandler接口在运行时在子类AbstractProtocol的init方法中
调用endpoint.init();对endpoint(链接器的监听器)进行初始化 ,初始化完成
    
    I、StandardXXX即 具体的组件类,如Server组件在实例化时 ,就会创建StandardServer对象
    II、load阶段 ,最终只加载到 connector组件
    III、在初始化时为什么调用initInternal方法 ? 
    上个博客提到LifeCycle接口管理着所有容器的运行周期(init、start、stop等),其中LifeCycleBase抽象类实现了 lifeCycle接口 init方法具体实现如下
     

      然后又重新定义了initInternal()抽象方法 ,server、service、engine、connector 等 各自 间接或直接的实现了 LifeCycleBase类并实现了 initlnernal()的方法 ,因此在他们进行初始化的时候会调                       用自己 的 initlnternal()实现  。LifeCycle中的 start()、stop() 也是这么来做的

            

     下一篇:tomcat的启动过程...


 

Tomcat源码(二):tomcat启动之前的初始化的更多相关文章

  1. tomcat源码之connector启动过程

    connector源码部分 构造函数 生命周期启动 启动endPoint 启动accepter 线程执行方法 SocketProcessor启动

  2. SpringMVC源码解析-DispatcherServlet启动流程和初始化

    在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...

  3. Tomcat源码分析 -- Tomcat整体架构

    引用链接:https://blog.csdn.net/w1992wishes/article/details/79242797

  4. [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...

  5. Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...

  6. Tomcat 源码分析(一)——启动与生命周期组件

    写在前面的话:读Tomcat源码也有段时间了,大领悟谈不上.一些小心得记录下来,供大家参考相护学习. 一.启动流程 Tomcat启动首先需要熟悉的是它的启动流程.和初学者第一天开始写Hello Wor ...

  7. Tomcat源码分析——启动与停止服务

    前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...

  8. Tomcat源码分析(二)------ 一次完整请求的里里外外

    Tomcat源码分析(二)------ 一次完整请求的里里外外   前几天分析了一下Tomcat的架构和启动过程,今天开始研究它的运转机制.Tomcat最本质就是个能运行JSP/Servlet的Web ...

  9. 详解Tomcat系列(一)-从源码分析Tomcat的启动

    在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...

  10. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

随机推荐

  1. js返回上一级代码和刷新页面代码

    返回上一级代码: <a href="javascript:;" onclick="history.go(-1);" class="icon_ba ...

  2. POJ - 2421 Constructing Roads (最小生成树)

    There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...

  3. SP16549 QTREE6 - Query on a tree VI(LCT)

    题意翻译 题目描述 给你一棵n个点的树,编号1~n.每个点可以是黑色,可以是白色.初始时所有点都是黑色.下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥 ...

  4. php中数组模拟队列、栈的函数以及数组指针操作

    1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...

  5. CRC循环冗余校验算法

    现实中通信链路都不会是理想的,比特在传输的过程中可能会出现差错,0变成1,1变成0.这就叫做比特差错.因此为了保证数据传输的可靠性,在计算网络传输数据时,必须采用各种检验措施来处理比特差错.在数据链路 ...

  6. HTML-JavaScript的DOM操作-非重点部分

    1.DOM的基本概念 DOM是文档对象模型,这种模型为树模型:文档是指标签文档(HTML文档),对象是指文档中每个元素:模型是指抽象划的东西. 2.Windows对象操作 一.属性和方法 属性(值或者 ...

  7. CSS3 文本溢出问题

    一.单行: 效果: 实现这各效果必须要加上: text-overflow: ellipsis; /*文本溢出*/ overflow: hidden; /*配合使用:溢出隐藏*/ white-space ...

  8. 0、PlayGround可视化

    Tensorflow新手通过PlayGround可视化初识神经网络 是不是觉得神经网络不够形象,概念不够清晰,如果你是新手,来玩玩PlayGround就知道,大神请绕道. PlayGround是一个在 ...

  9. Django项目创建与管理

    1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关知识大家可以参考Python社区. 2.准备环境 Django版本为2.0或更高 Py ...

  10. 51nod 1812 树的双直径 题解【树形DP】【贪心】

    老了-稍微麻烦一点的树形DP都想不到了. 题目描述 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点),使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有 ...