Tomcat源码(二):tomcat启动之前的初始化
2018-12-27 07:41:48来源:博客园 阅读 ()
当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的启动过程...
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:java个人博客源码
- java环境教程:Tomcat下载,安装,设置为Windows服务,启动 2020-06-09
- 你说研究过Spring里面的源码,循环依赖你会么? 2020-06-09
- 通俗理解spring源码(六)—— 默认标签(import、alias、be 2020-06-07
- Idea实现SpringBoot外置Tomcat的Web项目热部署(包含静态文 2020-06-04
- 学习源码的第八个月,我成了Spring的开源贡献者 2020-06-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash