StandardContext代表的是webapps下项目,一个项目就是一个StandardContext,作为Tomcat组件的一部分,就会实现Lifecycle接口,被Tomcat管理着生命周期,本文从StandardContext的启动记录。

StandardContext从被创建起,就是直接进入start方法,Tomcat中组件的start会检测是否初始化过,没有初始化不好意思回去初始化再来启动.  StandardContext有着两个监听器,分别是ContextConfig以及MemoryLeakTracingListener,第一个是辅助监听器,第二个是出现内存泄露辅助监听器.

按照上面的ContextConfig可能针对的事件,StandardContext先初始化initInternal方法,然后是ContextConfig#init.  StandardContext#initInternal,重要的是初始化了自身的线程池,以及JMX注册.   接下来查看ContextConfig#init.

ContextConfig#init:首先获取Digester类,之前在解析conf/server.xml时也是在Digester中处理的,所以这里下意识以为又要解析什么xml!contextConfig就是具体配置并开始解析的方法,解析的xml就是catalina-home/conf/content.xml,以前很少了解这个文件是干嘛的,下面有介绍这个文件conf/content.xml,解析完成conf/content.xml之后,实例化了webXmlParser为了解析web.xml文件!

catalina-home/conf/content.xml如下:   上面contentConfig方法就是用来解析该文件,有兴趣的可以再研究下,可以将断点打在Deigester的startElement、characters、endElement上;直接说结论,解析完之后StandardContext的watchResource就多了两个字符串的值,WEB-INF/web.xml,以及catalina-home/conf/web.xml,这个两个文件作用很明显项目部署就会根据这两个文件.

之后就到了StandardContext#start阶段,首先按照ContextConfig图分析的,会先执行ContextConfig#beforeStart.  分两步走,fixDocBase,antiLocking.

beforeStart第一步:代码片段位于ContextConfig#fixDocBase.  该方法是决定部署项目时候使用哪个项目,会根据server.xml中Host的unpackWars布尔值, 默认是true,比如webapps下存在ProjectA  以及ProjectA.war,那unpackWars为true就会动态的扩展该ProjectA,比较ProjectA和ProjectA.war的区别,具体实现是ExpandWar.expand.

beforeStart第二步,antiLocking,由于antiResourceLocking默认为false,所以相当于不作处理; antiResourceLocking如果是true,代表项目资源私有,他会悄悄在Tomcat catalina-home/temp目录下将你的项目复制一份,这样Tomcat运行时期你如果对原有项目修改不会生效,这样可能是为了防止热部署?

下一步到了StandardContext#startInternal,在这个方法中就部署了项目,代码量不包括方法调用就有了300+行;

Step1. postWorkDirectory()介绍

postWorkDirectory首先给每个StandardContext设置工作目录,比如ProjectA的工作目录就是catalina-home/work/Catalina/localhost/ProjectA,一个项目一个工作目录部署到catalina-home/work/Catalina/localhost下;  另外初始化了每个项目对应的ServletContext,采用ServletContext的实现ApplicationContext(和Spring的ApplicationContext重名),ApplicationContext相当于每个项目应用上下文吧(个人理解);

Step2.实例化WebResourceRoot实现类StandardRoot,并将StandardRoot和StandardContext关联起来(StandardContext的resource引用指向StandardRoot), StandardRoot#start ,

StandardRoot#startInternal就会处理/WEB-INF/lib下jar包等;

Step3.WebappLoader

实例化一个WebappLoader,单独用来加载每一个项目,将webappLoader和StandardContext关联起来(StandardContext的loader指向webappLoader). WebappLoader#start,初始化每一个项目的AppLoader,具体类型是WebappClassLoader; 并且获取到每个项目的classPath;  之后将WebappClassLoader绑定到Thread.currentThread上;

Step4. ContextConfig#configureStart

代码手动触发ContextConfig的configureStart方法,该方法就可以看成Web项目的入口, 其中webConfig方法介绍下,该方法解析了Web.xml,并且调用processServletContainerInitializers()来解析实现了ServletContainerInitializer的类(Servlet3.0之后的特性);webConfig方法并且将每个JSP实例化成StandardWrapper加入到StandardContext中,由于代码量太大 并且不是专门研究JSP,所以ContextConfig关于configureStart的研究告一段落;

Tomcat StandardContext启动中有太多值得思量的地方,jar包的加载、类加载器的设置、资源lib/classes的处理,这些暂时还没有能力分析有些遗憾,以后有机会再钻研!

这里梳理下一些常见的组件的启动流程,从StandardService开始,第一步是StandardEngine#start,  StandardEngine#start又调用StandardHost#start, StandardHost启动成功之前,调用HostConfig#start,负责部署解析webapps下的项目;  之后StandardHost启动成功,StandardEngine也启动成功,然后就可使StandardService的另一个模板的启动,Connector!

Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续的更多相关文章

  1. Tomcat8源码笔记(七)组件启动Server Service Engine Host启动

    一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...

  2. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

  3. Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

    以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...

  4. Tomcat8源码笔记(六)连接器Connector分析

    根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...

  5. Tomcat8源码笔记(三)Catalina加载过程

    之前介绍过 Catalina加载过程是Bootstrap的load调用的  Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...

  6. Tomcat8源码笔记(四)Server和Service初始化

    上一章 简单说明下Tomcat各个组件: Server:服务器,Tomcat服务器,一个Tomcat只有一个Server组件; Service:业务层,是Server下最大的子容器,一个Server可 ...

  7. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Job Manager 启动

    Job Manager 启动 https://t.zsxq.com/AurR3rN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...

  8. Flink 源码解析 —— Standalone session 模式启动流程

    Standalone session 模式启动流程 https://t.zsxq.com/EemAEIi 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0 ...

  9. Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动

    Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...

随机推荐

  1. http跳转https

    参考:http://www.cnblogs.com/tielemao/p/6386362.html webconfig中增加: <configuration> <system.web ...

  2. 大数据项目测试<二>项目的测试工作

    大数据的测试工作: 1.模块的单独测试 2.模块间的联调测试 3.系统的性能测试:内存泄露.磁盘占用.计算效率 4.数据验证(核心) 下面对各个模块的测试工作进行单独讲解. 0. 功能测试 1. 性能 ...

  3. 如何安装ubuntu系统

    https://www.cnblogs.com/Chinasf/archive/2010/05/06/1728840.html    [Ubuntu 下挂ISO到虚拟光驱的方法] 各种方法参考如下论坛 ...

  4. 学习笔记day1-计算机介绍

    1.1 “计算机”基本介绍 一.为什么需要计算机 对于现在的我们来说,每天要处理的信息量是巨大的,所以如果还是人工的来对这些数据进行处理,那么效率是很低的.此时计算机的出现就可以帮助我么来提高处理数据 ...

  5. shell脚本学习-文件包含

    跟着RUNOOB网站的教程学习的笔记 和其他语言一样,shell也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.shell文件包含的语法有两种形式 . filename  # ...

  6. 单点登陆cas

    1.TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证.TGT封装了TG ...

  7. yum安装常用工具命令

    树状目录结构(tree) yum install tree 上传下载工具(rz和sz) yum install lrzsz -------------------------------------- ...

  8. Robust Influence Maximization

    一.   研究背景 在社会和经济网络中,影响最大化问题在过去十年中得到广泛的研究,由于其广泛应用于病毒式营销[1,2],突破检测[3],谣言监测[4]等.例如公司可以通过向初始用户(称为种子)发送免费 ...

  9. G++与C++的区别

    C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已. 不同的编译器,会对代码做出一些不同的优化 比如说: a++;  和 ++a; 如果从标准C的角度去理解.a++这个 ...

  10. @Slf4j注解实现日志输出

    自己写日志的时候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); 每次写新的类,就需要重新 ...