当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. Java面向对象之异常(自定义异常)

    一.基础概念 在自定义的程序中,如果有了问题.也可以像java中的异常一样,对问题进行描述. 注意:1.继承RuntimeException的异常,不需要进行处理.在执行过程中有异常会直接抛出. 2. ...

  2. php面向对象编程_1

    1, php面向对象编程的三大特征: (1) 封装性,封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法)才能对数据进行操作. (2) 继承 ...

  3. 基于KMP与Levenshtein模糊匹配算法的银行联行号查询

    在人民银行那里,每个银行的每一个营业网点都有自己唯一的银行联行号,根据这个号码能快速定位一间银行具体的分支行,就像根据一个身份证号码能快速确定一个人一样.例如汇款时,汇款单上要求填写收款人开户行,然后 ...

  4. 新公司,环境搭建,windows上的坑

    1 在windows上安装nodejs环境,node -v 后可以看到版本号 2 在windows上安装nvm管理node的版本,可以对node版本自由切换,使用5.3.0版本的node 3 在win ...

  5. java类的基本结构

    对象依赖于类存在. 分析过程先有对象后有类,开发过程中先有类后有对象. new是为新建对象开辟内存空间的运算符:以类为模板,开辟空间实例化一个对象,并返回该对象的一个引用. 成员变量 直接在类中定义 ...

  6. c++ Initialization

    c++ 的初始化过程比较复杂:根据对象的storage duration来分类.所谓storage duration是对象而言的,Storage duration is the property of ...

  7. 记录两道有趣的有关php数组的面试题

    <?php $arr=[ ['张三','李四','王五'], ['吃鸡','消消乐','火影'], ['25','26','28'], ]; '如何转换为' $arr1=[ ['张三','吃鸡' ...

  8. mybatis的入门(二)

    上篇文章首先介绍了JDBC操作数据库的相关知识,并总结了JDBC操作数据存在的一些问题,那么这篇文章我们来介绍下mybatis的相关内容 一.mybatis的架构图 下面对上面的架构图详细说明下: 1 ...

  9. POJ_3268 Silver Cow Party 【最短路】

    一.题面 POJ3268 二.分析 该题的意思就是给定了一个由每个节点代表农场的有向图,选定一个农场X办party,其余农场的都要去,每个农场的cow都走最短路,走的时间最久的cow耗时多少. 了解题 ...

  10. Windows搭建Go语言环境·

    对于Windows用户,Go语言提供两种安装方式(源码安装除外): .MSI安装:程序会自动配置你的安装 .ZIP安装:需要你手动设置一些环境变量 一.MSI安装 1.下载安装包(根据操作系统选择相应 ...