Tomcat源码(二):tomcat启动之前的初始化
当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启动之前的初始化的更多相关文章
- tomcat源码之connector启动过程
connector源码部分 构造函数 生命周期启动 启动endPoint 启动accepter 线程执行方法 SocketProcessor启动
- SpringMVC源码解析-DispatcherServlet启动流程和初始化
在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...
- Tomcat源码分析 -- Tomcat整体架构
引用链接:https://blog.csdn.net/w1992wishes/article/details/79242797
- [Tomcat 源码分析系列] (二) : Tomcat 启动脚本-catalina.bat
概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 ca ...
- Tomcat源码分析之—具体启动流程分析
从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...
- Tomcat 源码分析(一)——启动与生命周期组件
写在前面的话:读Tomcat源码也有段时间了,大领悟谈不上.一些小心得记录下来,供大家参考相护学习. 一.启动流程 Tomcat启动首先需要熟悉的是它的启动流程.和初学者第一天开始写Hello Wor ...
- Tomcat源码分析——启动与停止服务
前言 熟悉Tomcat的工程师们,肯定都知道Tomcat是如何启动与停止的.对于startup.sh.startup.bat.shutdown.sh.shutdown.bat等脚本或者批处理命令,大家 ...
- Tomcat源码分析(二)------ 一次完整请求的里里外外
Tomcat源码分析(二)------ 一次完整请求的里里外外 前几天分析了一下Tomcat的架构和启动过程,今天开始研究它的运转机制.Tomcat最本质就是个能运行JSP/Servlet的Web ...
- 详解Tomcat系列(一)-从源码分析Tomcat的启动
在整个Tomcat系列文章讲解之前, 我想说的是虽然整个Tomcat体系比较复杂, 但是Tomcat中的代码并不难读, 只要认真花点功夫, 一定能啃下来. 由于篇幅的原因, 很难把Tomcat所有的知 ...
- Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...
随机推荐
- 代理服务器和NAT技术
一.代理服务器 所谓“代理”,就是代而劳之的意思.代理服务器就是代理网络用户去取得网络信息,形象的说:它是网络信息的中转站,使得一个网络终端和另一个网络终端不直接进行相连,代理网络用户去取得信息.主要 ...
- django2使用xadmin打造适合国人的后台管理系统(1)
python火了之后,学习python的人也越来越多了,python做web开发的话,flask.django是比较火的框架了,django是一个比较大的框架,也是一个快速开发利器.但是,django ...
- 函数新特性、内联函数、const详解
一.函数回顾与后置返回类型 函数定义中,形参如果在函数体内用不到的话,则可以不给形参变量名字,只给其类型. 函数声明时,可以只有形参类型,没有形参名 把函数返回类型放到函数名字之前,这种写法,叫前置返 ...
- Win10通电自动开机的解决办法
前几天Win10强推系统升级,更新后无意中发现每次通电电脑就自动开机了. 解决办法: 打开控制面板>电源选项>选择电源按钮的功能,把关机设置里的“启用快速启动(推荐)”选项去掉就可以了. ...
- 原始MAC地址
D8CB8AD97D47
- react-router的简单使用
React Router是一个基于React之上的强大路由库,可以让你向应用中快速的添加视图和数据流,同时保持页面与URL间的同步. 1.安装: npm install --save react-ro ...
- Go语言介绍
Go语言简介 Go语言是谷歌2009发布的第二款开源编程语言. Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持并行进程. Go ...
- [短期持续更新]Codeforces 构造题一览
说实话我觉得做这种题很没意思(不够硬核), 可是人有短板终究是要补的...起码这种类型补起来相对简单 所以还是把先前准备好的专题放下吧,做点实现上比较休闲的题 ps.为了精简篇幅,代码全部丢到ubun ...
- WebFrom页面绑定数据过于冗长的处理方法
嘛 这个是当时写完东西之后 功能没什么问题 但是由于页面绑定的数据太长 破坏了整体的样式(对于本人来说 样式就是浮云....) 所以测试就跟我说必须弄好看点 于是乎 我就找到了下面这种方法 因为我这 ...
- pandas数据清洗
1.我已安装好Anavonda3.5.所以我只用打开"jupyter notebook",然后打开浏览器 然后点击右侧的“new",然后打开python3