上一章
简单说明下Tomcat各个组件:
Server:服务器,Tomcat服务器,一个Tomcat只有一个Server组件;
Service:业务层,是Server下最大的子容器,一个Server可以包含多个Service组件;
Connector:连接器,Service的子容器,一个Service可以有多个Connector连接器,作用体现在对外,接收客户端请求,HTTP、TCP等;
Container:Service核心组件,通常有Engine、Host、Context、Wrapper,作用是将客户端请求处理;
Server组件
Server实例化
前面我们已经知道Tomcat实例化的是StandardServer,Server同样实现了Lifecycle接口, 关于Tomcat Lifecycle生命周期,这里就不多讲了
StandardServer实例化初始化了globalNamingResources,具体干嘛的还不清楚,和JNDI相关;Catalina的load方法的initNaming方法,决定了这里会添加第一个监听器NamingContextListener,这个LifecycleListener暂时不需要了解,JNDI上下文相关的. 其次的LifecycleListener是通过server.xml读取.
也就是说StandardServer实例化之后共有六个LifecycleListener,当然这些LifecycleListener具体作用暂时还不用知道,看名字简单了解下打印日志、内存防止泄露等等.
StandardServer组件 init初始化
组件真正的初始化方法initInternal
只要继承了LifecycleMBeanBase的类,调用父类的initInternal方法,目的是为了将该组件注册到JMX管理,JMX的作用暂时不是现在记录的重点。加载classLoader,也就是commonLoader,指向catalina.home/lib,对下面的jar文件进行校验;最后就是遍历service组件,分别调用init方法初始化.
Service初始化流程
上图是我按照StandardService的init方法简单绘制的。在记录Service初始化流程之前,介绍下StandardService实例化的过程。
Service实例化过程
先查看下server.xml对于Service元素的定义,以Tomcat中标准的server.xml为例. <Service>下就以这样三个子元素为例,<Executor> <Connector> <Engine>
关于Tomcat如何解析XML并且生成对应实例,Tomcat8源码笔记(三)Catalina加载过程
下面就是StandardService初始化具体流程,super.initInternal方法JMX注册; 初始化按照顺序 container--->Executor--->mapperListener---->Connector的顺序,由于每个组件都比较庞大,所以分多篇博客记录。
总结
Tomcat的初始化工作,主要是Server初始化,而Server初始化主要看Service的初始化,Service的初始化工作主要是 initInternal方法, 又由其他组件 Container、(Executor)、mapperListener、Connector的初始化来完成。 上面总结了StandardServer、StandardService的实例化、初始化流程。