上一章

简单说明下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的实例化、初始化流程。

Tomcat8源码笔记(四)Server和Service初始化的更多相关文章

  1. Tomcat8源码笔记(七)组件启动Server Service Engine Host启动

    一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...

  2. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

  3. Tomcat8源码笔记(六)连接器Connector分析

    根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...

  4. Tomcat8源码笔记(三)Catalina加载过程

    之前介绍过 Catalina加载过程是Bootstrap的load调用的  Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...

  5. Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

    以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...

  6. Tomcat8源码笔记(一)Lifecycle接口

    第一次阅读Tomcat8源码,就以Lifecycle作为笔记阅读的开篇吧,一千个读者就有一千个哈姆雷特,每个人都Tomcat的理解都不同,如果不记录一次Tomcat源码可能忘了就忘了. 断断DEBUG ...

  7. Tomcat8源码笔记(二)Bootstrap启动

    TOMCAT源码调试入口是Bootstrap类的main方法,我的启动参数VM: -Dcatalina.home=E:/Tomcat_Source_Code/apache-tomcat-8.0.53- ...

  8. tomcat源码阅读之Server和Service接口解析

    tomcat中的服务器组件接口是Server接口,服务接口是Service,Server接口表示Catalina的整个servlet引擎,囊括了所有的组件,提供了一种优雅的方式来启动/关闭Catali ...

  9. laravel5.5源码笔记(七、数据库初始化)

    laravel中的数据库也是以服务提供者进行初始化的名为DatabaseServiceProvider,在config文件的providers数组中有写.路径为vendor\laravel\frame ...

随机推荐

  1. POJ 1655.Balancing Act 树形dp 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14550   Accepted: 6173 De ...

  2. 线程属性 pthread_attr_t

    参考资料: https://blog.csdn.net/hudashi/article/details/7709413 Posix线程中的线程属性pthread_attr_t主要包括scope属性.d ...

  3. [SoapUI] 在SoapUI中,设置开关批量保存整个Response,作为期望结果进行校验

    //获取保存response的文件路径和名称 def testSuiteName = context.testCase.testSuite.name def testCaseName = contex ...

  4. js--获得当前系统时间

    window.onload = function () { var oBody = document.body; setInterval( fnTime, 1000 ); fnTime (); fun ...

  5. flask更改已有的response

    今天遇到个问题,需要更改返回的response,但框架已经生成了一个response,所以需要直接更改. 试着找了找解决办法,最终解决方式如下: #下文中payload的类型是 # class Res ...

  6. SprirngBoot微服务之间的交互—— restTemplate

    一 例:需要在storage服务中请求utils服务的某个接口(两个服务都已向同一台eureka server 注册) 步骤: 1 在utils创建需被调用的接口 @RestController @R ...

  7. html样式板

    一.bootstrap 二.element 三.iconfont图标 四.font awesome图标

  8. ios 单例的再次理解

    单例模式    在建模的时候,如果这个东西确实只需要一个对象,多余的对象都是无意义的,那么就考虑用单例模式.比如定位管理(CLLocationManager),硬件设备就只有一  个,弄再多的逻辑对象 ...

  9. tomcat 配置图片服务器

    在后台和前端交互时,遇到了后台存储的图片,前端根据地址无法访问,使用Tomcat搭建图片服务器 1.找到tomcat下的server.xml文件 2.配置文件下加入service节点(在原有的serv ...

  10. MFC程序执行后台操作时不允许操作界面的一种方法

    在使用MFC编写界面程序时,有时候会遇到像点击按钮后,后台进行大量操作后才显示处理结果这种情况,在后台处理过程中,界面不应该被允许做任何操作,这里介绍一种方法. 解决办法 点击按钮后,弹出一个模态对话 ...