7.3 Container 分析

2017-04-19  本文已影响0人  AssassinFGO

7.3.1 ContainerBase的结构

Container 是 Tomcat 中容器的接口,其一共有四个子接口 Engine、Host、Context、Wrapper 一个默认实现类 ContainerBase,每个子接口都是一个容器,每个接口都有一个对应的 StandardXXX 实现类,并且都继承自 ContainerBase。同时 Container 还继承了 Lifecycle 借口,其和其子类都符合之前的生命周期管理模式。

Container 结构图

7.3.2 Container 的4个子容器

Container 的子容器是逐级包含的关系:

7.3.3 4种容器的配置方式‘

7.3.4 Container 的启动

Container 的启动通过 init 和 start 方法来完成,这两个方法会在 Tomcat 启动时被 Service 调用。Container 继承 Lifecycle 所以也是按照 Tomcat 的生命周期来管理,通过 init 和 start 进行初始化并调用子类的 initInternal 和 startInternal 方法进行具体处理,但是之前 Tomcat 整体结构的启动过程有所不同:

ContainerBase

containerBase 的** initInternal **方法主要是初始化 ThreadPollExecutor 类型的 startStopExecutor 属性,用于管理启动关闭的线程

initInternal 方法
containerBase 的 startInternal 方法主要做了5件事: startInternal 方法

Engine

Service 会调用最顶层容器的 init 和 start 方法,如果使用了 Engine 就会调用 Engine 的生命周期方法

Engine 对应方法

Host

Host 的默认实现类 StandardHost 没有重写 initInternal 方法,所以会调用ContainerBase 的 initInternal 方法。重写了 startInternal 方法: startInternal 方法主要检查 Host 管道中是否有指定的 Valve(阀) ,如果没有则添加。

StandardHost startInternal 方法

Context

Context 的默认实现类 StandardContext 的 startInternal 方法会调用 web.xml 中定义的 Listener,另外还初始化了其中的 Filter 和 load-on-startup 的Servlet。

Standard Context startInternal 方法

Wrapper

StandardWrapper没有重写 initInternal 方法,重写了 startInternal 方法

Wrapper startInternal 方法
上一篇 下一篇

猜你喜欢

热点阅读