最近在看Tomcat的源码,对Tomcat的架构深入地研究了下,下面让我们来看下Tomcat的容器模型:
从上图可以看出 Tomcat 的容器分为四个等级,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个
Web 工程。
接下来我们来看下Tomcat 启动过程的时序图:
因为在Tomcat 的容器等级中,Context 容器是直接管理 Servlet 在容器中的包装类 Wrapper,所以 Context 容器如何运行将
直接影响 Servlet 的工作方式,所以很有必要了解StandardContext 容器详细的启动过程:
当 Context 容器初始化状态设为 init 时,添加在 Contex 容器的 Listener 将会被调用。ContextConfig 继承了
LifecycleListener 接口,它是在调用清单 3 时被加入到 StandardContext 容器中。ContextConfig 类会负责整个 Web
应用的配置文件的解析工作。
ContextConfig 的 init 方法将会主要完成以下工作:
1. 创建用于解析 xml 配置文件的 contextDigester 对象
2. 读取默认 context.xml 配置文件,如果存在解析它
3. 读取默认 Host 配置文件,如果存在解析它
4. 读取默认 Context 自身的配置文件,如果存在解析它
5. 设置 Context 的 DocBase
ContextConfig 的 init 方法完成后,Context 容器的会执行 startInternal 方法,这个方法启动逻辑比较复杂,主要包
括如下几个部分:
1. 创建读取资源文件的对象
2. 创建 ClassLoader 对象
3. 设置应用的工作目录
4. 启动相关的辅助类如:logger、realm、resources 等
5. 修改启动状态,通知感兴趣的观察者(Web 应用的配置)
6. 子容器的初始化
7. 获取 ServletContext 并设置必要的参数
8. 初始化“load on startup”的 Servlet
好了先写到这,下次我会写一下Tomcat中使用到的设计模式。