目录
一:流程
二:源码解析
1.Lifecycle
2 .各组件的默认实现
3 .源码入口
三:总结
一:流程

步骤 :
1 )启动 tomcat , 需要调用 bin/startup.bat ( 在 linux 目录下 , 需要调用 bin/startup.sh) ,在startup.bat 脚本中 , 调用了 catalina.bat 。
2 ) 在 catalina.bat 脚本文件中,调用了 BootStrap 中的 main 方法。
3 )在 BootStrap 的 main 方法中调用了 init 方法,来创建 Catalina 及初始化类加载器。
4 )在 BootStrap 的 main 方法中调用了 load 方法, 在其中又调用了 Catalina 的 load 方法。
5 )在 Catalina 的 load 方法中 , 需要进行一些初始化的工作 , 并需要构造 Digester 对象 , 用
于解析 XML 。
6 )然后在调用后续组件的初始化操作 。。。 加载Tomcat 的配置文件,初始化容器组件 ,监听对应的端口号,准备接受客户端请求。
二:源码解析
1.Lifecycle
由于所有的组件均存在初始化、启动、停止等生命周期方法,拥有生命周期管理的特
性, 所以 Tomcat 在设计的时候, 基于生命周期管理抽象成了一个接口 Lifecycle ,而组件Server 、 Service 、 Container 、 Executor 、 Connector 组件 , 都实现了一个生命周期的接口,从而具有了以下生命周期中的核心方法:
1 ) init ():初始化组件
2 ) start ():启动组件
3 ) stop ():停止组件
4 ) destroy ():销毁组件

2 .各组件的默认实现
上面我们提到的 Server 、 Service 、 Engine 、 Host 、 Context 都是接口, 下图中罗列了这些接口的默认实现类。当前对于 Endpoint 组件来说,在 Tomcat 中没有对应的 Endpoint接口, 但是有一个抽象类 AbstractEndpoint ,其下有三个实现类: NioEndpoint 、Nio2Endpoint, AprEndpoint ,这三个实现类,分别对应于前面讲解链接器 Coyote时, 提到的链接器支持的三种IO 模型, NIO , NIO2 , APR , Tomcat8.5 版本中,默认采用的是 NioEndpoint 。

ProtocolHandler : Coyote 协议接口,通过封装 Endpoint 和 Processor , 实现针对具体协议的处理功能。Tomcat 按照协议和 IO 提供了 6 个实现类。
AJP协议:
1 ) AjpNioProtocol :采用 NIO 的 IO 模型。
2 ) AjpNio2Protocol :采用 NIO2 的 IO 模型。
3 ) AjpAprProtocol :采用 APR 的 IO 模型,需要依赖于 APR 库。
HTTP协议:
1 ) Http11NioProtocol :采用 NIO 的 IO 模型,默认使用的协议(如果服务器没有安装APR)。
2 ) Http11Nio2Protocol :采用 NIO2 的 IO 模型。
3 ) Http11AprProtocol :采用 APR 的 IO 模型,需要依赖于 APR 库。
3 .源码入口
目录: org.apache.catalina.startupMainClass : BootStrap ‐‐‐‐> main(String[] args)

三:总结
从启动流程图中以及源码中,我们可以看出 Tomcat 的启动过程非常标准化, 统一按照生命周期管理接口Lifecycle 的定义进行启动。首先调用 init() 方法进行组件的逐级初始化操作,然后再调用start() 方法进行启动。
每一级的组件除了完成自身的处理外,还要负责调用子组件响应的生命周期管理方法,组件与组件之间是松耦合的,因为我们可以很容易的通过配置文件进行修改和替换。















