Tomcat源码架构笔记(init初始化篇)

warning: 这篇文章距离上次修改已过1410天,其中的内容可能已经有所变动。

上一篇文章里,我们基本上了解到Tomcat是如何启动的,和入口函数要执行的两大关键阶段:

  • init初始化阶段
  • start启动阶段(传送门

本篇文章详细展开在Tomcat init初始化阶段,具体干了些什么?是怎么干的?

TomcatTomcat


Tomcat init初始化阶段

Tomcat init初始化阶段Tomcat init初始化阶段


加载初始化

load 加载初始化load 加载初始化

通过反射调用 Catalina.load()方法

通过反射调用 Catalina.load()方法通过反射调用 Catalina.load()方法


开始初始化一个Server实例

开始初始化一个Server实例开始初始化一个Server实例

解析server.xml文件

解析server.xml文件解析server.xml文件

调用digester对象真正解析xml

调用digester对象真正解析xml调用digester对象真正解析xml

解析返回的root

这里仅仅读取xml里有的东西,不管其他的。

返回的root和xml相对应返回的root和xml相对应

server 初始化

调用Server.init() 进行初始化调用Server.init() 进行初始化

LifecycleBase(统一管理组件生命周期管理接口)

每个组件初始化都会来到该类的这个方法,因为这些组件都实现了lifecycle生命周期接口

通过LifecycleBase统一管理组件的生命周期通过LifecycleBase统一管理组件的生命周期


初始化子容器service

通过子类来实现初始化子容器service(一个或多个)的具体逻辑。

初始化子容器service(一个或多个)初始化子容器service(一个或多个)

再次来到LifecycleBase类

Service初始化也是通过LifecycleBase类来管理的Service初始化也是通过LifecycleBase类来管理的

StandardService.initInternal()

StandardService初始化一个Engine(servlet容器引擎)和多个Connector(连接器)StandardService初始化一个Engine(servlet容器引擎)和多个Connector(连接器)


Engine初始化

Engine初始化也是通过LifecycleBase类来管理的(截图略)

然后来到了StandardEngineinitInternal()方法

StandardEngine的initInternal()方法StandardEngine的initInternal()方法

通过super.initInternal();正式开始Engine初始化操作

Engine组件初始化Engine组件初始化

Engine组件初始化,就是创建了一个线程池startStopExecutor

这个线程池在Engine组件的start阶段使用,可以并行运行提高start阶段的效率。


Connector初始化

Connector初始化也是通过LifecycleBase类来管理的(截图略)

connector 组件初始化,它有两个非常重要的组件adapter和protocolHandlerconnector 组件初始化,它有两个非常重要的组件adapter和protocolHandler

protocolHandler初始化protocolHandler初始化

来到了AbstractHttp11Protocol类init()方法来到了AbstractHttp11Protocol类init()方法

来到了AbstractProtocol类,进行通信端点初始化来到了AbstractProtocol类,进行通信端点初始化

来到了AbstractJsseEndpoint类init()方法来到了AbstractJsseEndpoint类init()方法

来到了AbstractEndpoint类init()方法来到了AbstractEndpoint类init()方法

来到了NioEndpoint类bind()方法,开始绑定来到了NioEndpoint类bind()方法,开始绑定


ok,到此Tomcat的init初始化阶段基本完成,下一篇我们探究下Tomcat的start启动阶段。

评论已关闭