当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. Spring定时任务执行

    备注:这个是基于搭建好spring的环境下的 注解方式: 1.定时任务类 package com.test;import java.util.Date;import org.springframewo ...

  2. file.delete()的优化

    //删除暂存的pdf File file =new File(pdfFilename); file.delete(); Path path2 = Paths.get(pdfFilename); Fil ...

  3. php.ini中safe_mode开启之后对于PHP系统函数的影响

    safe_mode是提供一个基本安全的共享环境. 在一个多用户共享的phpweb服务器上,当这台服务器开启了safe_mode模式,有以下函数将会受到影响. 首先,以下尝试访问文件系统的函数将会被限制 ...

  4. Objective-C中的meta-class

    讨论Objective-C的一个奇怪的概念 meta-class 在Objective-C中的每个类,都有它自己相关的meta-class,但因为你很少直接使用meta-class,所以显得很神秘.  ...

  5. 简易 PHP 教程小记

    一.简介: 1.用处广 2.免费 3.PHP Hypertext Preprocessor 二.语法: 1.<?php coders ?> 2.注释:"#" " ...

  6. 什么是cluster(群集)

    一.群集的概念 在互联网应用中,随着站点对硬件性能.相应速度.服务稳定性.数据可靠性等要求越来越高,单台服务器力不从心,使用小型机或大型机价格还太昂贵,因此我们使用普通服务器来构建服务群集显然最划算. ...

  7. 使用Avd 调试慢的解决方案

         AVD 太慢了,不仅启动,而且运行慢.以致于要用手机去调.你觉得这样方便吗?     如果没有一个简单快速的开发调试环境,把时间都浪费在启动,调试及等待上,那是对生命的浪费.   必要条件: ...

  8. TX2之多线程读取视频及深度学习推理

    背景 一般在TX2上部署深度学习模型时,都是读取摄像头视频或传入视频文件进行推理,从视频中抽取帧进行目标检测等任务.对于大点的模型,推理的速度是赶不上摄像头或视频的帧率的,如果我们使用单线程进行处理, ...

  9. yolov3源码分析keras(二)损失函数计算

    一.前言 损失函数计算主要分析两部分一部分是yolo_head函数的分析另一部分为ignore_mask的生成的分析. 二.重要细节分析 2.1损失函数计算具体代码及部分分析 def yolo_los ...

  10. Numpy中扁平化函数ravel()和flatten()的区别

    在Numpy中经常使用到的操作由扁平化操作,Numpy提供了两个函数进行此操作,他们的功能相同,但在内存上有很大的不同. 先来看这两个函数的使用: from numpy import * a = ar ...