系列文章目录
第一章 HTTP协议必知必会详解
第二章 一文读懂 Servlet 规范与 Servlet 容器加粗样式
第三章 深入拆解 Servlet 实战:纯手工打造与运行
第四章 深入拆解 Tomcat 系统架构:连接器如何设计
第五章 深入拆解Tomcat架构:多层容器设计原理
文章目录
- 系列文章目录
- 前言
- 一、思维导图
- [二、Tomcat 组件管理背景](#二、Tomcat 组件管理背景)
- [三、核心:LifeCycle 接口](#三、核心:LifeCycle 接口)
-
- [3.1 核心方法](#3.1 核心方法)
- [3.2 生命周期状态(共 10 种)](#3.2 生命周期状态(共 10 种))
- [3.3 工作机制](#3.3 工作机制)
- 四、扩展性:生命周期事件(观察者模式)
- [五、复用性:LifeCycleBase 抽象基类(模板方法)](#五、复用性:LifeCycleBase 抽象基类(模板方法))
- 六、关键设计模式汇总
- 七、整体类结构
- 八、常见问题
前言
Tomcat 通过LifeCycle 生命周期接口实现一键式启停,依托组合模式统一管理父子组件、观察者模式实现生命周期事件扩展、模板方法模式在LifeCycleBase 抽象基类中复用通用逻辑,只需调用顶层Server 组件的 init/start 方法,即可完成全组件链式启动与停止,同时明确组件生命周期状态流转与事件触发机制。
一、思维导图

二、Tomcat 组件管理背景
Tomcat 包含Server、Service、Connector、Container等多层组件,启动时需创建、组装、初始化,停止时需资源释放、销毁,组件存在两层固定关系:
- 大小关系:大组件管理小组件(Server→Service→Connector/Container)
- 内外关系 :外层组件驱动内层组件处理请求
为避免启动 / 停止混乱、遗漏、重复,Tomcat 设计统一生命周期管理机制。
三、核心:LifeCycle 接口
Tomcat 将所有组件的不变生命周期行为抽象为LifeCycle 接口,实现一键式管控。
3.1 核心方法
- init():初始化
- start():启动
- stop():停止
- destroy():销毁
3.2 生命周期状态(共 10 种)
NEW、INITIALIZING、INITIALIZED、STARTING_PREP、STARTING、STARTED、STOPPING_PREP、STOPPING、STOPPED、DESTROYING、DESTROYED、FAILED
3.3 工作机制
父组件的init()/start()会递归调用子组件对应方法,仅需调用Server顶层组件,即可启动整个 Tomcat。
四、扩展性:生命周期事件(观察者模式)
为遵循开闭原则,避免硬编码扩展逻辑,Tomcat 将状态转变定义为事件,通过监听器实现扩展:
- LifeCycle 新增监听器方法:addLifecycleListener/removeLifecycleListener
- 状态变更自动触发事件(如 BEFORE_INIT_EVENT、AFTER_START_EVENT)
- 监听器可自定义逻辑,支持动态增删,低耦合非侵入
五、复用性:LifeCycleBase 抽象基类(模板方法)
为减少重复代码,Tomcat 提供LifeCycleBase实现 LifeCycle 接口,封装通用逻辑:
- 状态合法性校验
- 生命周期事件触发
- 监听器管理
子类只需实现抽象内部方法:
- initInternal()
- startInternal()
- stopInternal()
- destroyInternal()
以init()为例,执行流程:
- 校验当前状态必须为NEW
- 触发INITIALIZING事件
- 调用子类initInternal()
- 触发INITIALIZED事件
六、关键设计模式汇总
| 设计模式 | 作用 | 应用场景 |
|---|---|---|
| 组合模式 | 统一管理父子组件 | 一键启动 / 停止所有组件 |
| 观察者模式 | 生命周期扩展 | 组件状态事件监听 |
| 模板方法模式 | 通用逻辑复用 | LifeCycleBase 封装公共流程 |
七、整体类结构
- StandardServer、StandardService 直接继承 LifeCycleBase
- 容器组件(StandardEngine 等)继承 ContainerBase,而 ContainerBase 继承 LifeCycleBase
- 所有组件拥有一致的生命周期管理能力
八、常见问题
- 问题 1(核心机制侧重) :Tomcat 如何实现 "一键启停"?
答案:Tomcat 通过LifeCycle 接口统一规范所有组件的初始化、启动、停止、销毁方法,利用组合模式让父组件递归调用子组件的生命周期方法,只需调用顶层 Server 组件的 init () 和 start (),即可触发全组件链式启动,实现一键启停。 - 问题 2(扩展性侧重) :Tomcat 如何在不修改源码的前提下扩展组件启动逻辑?
答案:基于观察者模式,Tomcat 将组件状态转变定义为生命周期事件,支持动态注册 / 移除LifeCycleListener监听器,在事件触发时执行自定义逻辑,遵循开闭原则,实现无侵入扩展。 - 问题 3(代码复用侧重) :LifeCycleBase 抽象类的作用是什么,为何要设计 internal 方法?
答案:LifeCycleBase用于封装所有组件生命周期的通用逻辑(状态校验、事件触发),避免子类重复实现;设计initInternal()等方法是采用模板方法模式,将固定流程放在基类,个性化逻辑交给子类实现,兼顾统一规范与定制化需求。