Tomcat源码架构笔记(init初始化篇)
warning:
这篇文章距离上次修改已过1508天,其中的内容可能已经有所变动。
在上一篇文章里,我们基本上了解到Tomcat是如何启动的,和入口函数要执行的两大关键阶段:
- init初始化阶段
- start启动阶段(传送门)
本篇文章详细展开在Tomcat init初始化阶段,具体干了些什么?是怎么干的?
![Tomcat Tomcat](/usr/themes/waxy/img/loading.gif)
Tomcat init初始化阶段
![Tomcat init初始化阶段 Tomcat init初始化阶段](/usr/themes/waxy/img/loading.gif)
加载初始化
![load 加载初始化 load 加载初始化](/usr/themes/waxy/img/loading.gif)
通过反射调用 Catalina.load()方法
![通过反射调用 Catalina.load()方法 通过反射调用 Catalina.load()方法](/usr/themes/waxy/img/loading.gif)
开始初始化一个Server实例
![开始初始化一个Server实例 开始初始化一个Server实例](/usr/themes/waxy/img/loading.gif)
解析server.xml文件
![解析server.xml文件 解析server.xml文件](/usr/themes/waxy/img/loading.gif)
调用digester对象真正解析xml
![调用digester对象真正解析xml 调用digester对象真正解析xml](/usr/themes/waxy/img/loading.gif)
解析返回的root
这里仅仅读取xml里有的东西,不管其他的。
![返回的root和xml相对应 返回的root和xml相对应](/usr/themes/waxy/img/loading.gif)
server 初始化
![调用Server.init() 进行初始化 调用Server.init() 进行初始化](/usr/themes/waxy/img/loading.gif)
LifecycleBase(统一管理组件生命周期管理接口)
每个组件初始化都会来到该类的这个方法,因为这些组件都实现了lifecycle生命周期接口
![通过LifecycleBase统一管理组件的生命周期 通过LifecycleBase统一管理组件的生命周期](/usr/themes/waxy/img/loading.gif)
初始化子容器service
通过子类来实现初始化子容器service(一个或多个)的具体逻辑。
![初始化子容器service(一个或多个) 初始化子容器service(一个或多个)](/usr/themes/waxy/img/loading.gif)
再次来到LifecycleBase类
![Service初始化也是通过LifecycleBase类来管理的 Service初始化也是通过LifecycleBase类来管理的](/usr/themes/waxy/img/loading.gif)
StandardService.initInternal()
![StandardService初始化一个Engine(servlet容器引擎)和多个Connector(连接器) StandardService初始化一个Engine(servlet容器引擎)和多个Connector(连接器)](/usr/themes/waxy/img/loading.gif)
Engine初始化
Engine初始化也是通过LifecycleBase
类来管理的(截图略)
然后来到了StandardEngine
的initInternal()
方法
![StandardEngine的initInternal()方法 StandardEngine的initInternal()方法](/usr/themes/waxy/img/loading.gif)
通过super.initInternal();
正式开始Engine初始化操作
![Engine组件初始化 Engine组件初始化](/usr/themes/waxy/img/loading.gif)
Engine组件初始化,就是创建了一个线程池startStopExecutor
。
这个线程池在Engine组件的start阶段使用,可以并行运行提高start阶段的效率。
Connector初始化
Connector初始化也是通过LifecycleBase
类来管理的(截图略)
![connector 组件初始化,它有两个非常重要的组件adapter和protocolHandler connector 组件初始化,它有两个非常重要的组件adapter和protocolHandler](/usr/themes/waxy/img/loading.gif)
![protocolHandler初始化 protocolHandler初始化](/usr/themes/waxy/img/loading.gif)
![来到了AbstractHttp11Protocol类init()方法 来到了AbstractHttp11Protocol类init()方法](/usr/themes/waxy/img/loading.gif)
![来到了AbstractProtocol类,进行通信端点初始化 来到了AbstractProtocol类,进行通信端点初始化](/usr/themes/waxy/img/loading.gif)
![来到了AbstractJsseEndpoint类init()方法 来到了AbstractJsseEndpoint类init()方法](/usr/themes/waxy/img/loading.gif)
![来到了AbstractEndpoint类init()方法 来到了AbstractEndpoint类init()方法](/usr/themes/waxy/img/loading.gif)
![来到了NioEndpoint类bind()方法,开始绑定 来到了NioEndpoint类bind()方法,开始绑定](/usr/themes/waxy/img/loading.gif)
ok,到此Tomcat的init初始化阶段基本完成,下一篇我们探究下Tomcat的start启动阶段。