SpringBoot内嵌tomcat(3)【Tomcat各组件的创建】源码简析

编程

结合下述源码分析可知整个代码结构大致如下图: 
Container 层级从Engine开始

org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory

在方法.getWebServer(ServletContextInitializer... initializers) 内: 实例化org.apache.catalina.startup.Tomcat,用org.springframework.boot.web.embedded.tomcat.TomcatWebServer封装。

void customizeConnector(Connector connector) : 设置Connector成员变量属性值
void configureEngine(Engine engine): 设置Engine成员变量属性值
void prepareContext(Host host, ServletContextInitializer[] initializers):  下文重点讲

org.apache.catalina.startup.Tomcat

Tomcat几个重要接口的结构图:

org.apache.catalina.util.LifecycleMBeanBase ->org.apache.catalina.util.LifecycleBase -> implements org.apache.catalina.Lifecycle 
org.apache.catalina.Lifecycle 中的注释里阐述了生命周期(LifecycleState)过程:

Tomcat的构造函数是空方法。主要关注以下几个方法

org.apache.catalina.Service Tomcat.getService() 方法


实际上的处理逻辑在 org.apache.catalina.Server getServer()

Server 实际对象是: org.apache.catalina.core.StandardServer 
Service 实际对象是:org.apache.catalina.core.StandardService  
都实现了  extends org.apache.catalina.util.LifecycleMBeanBase 。

给 Server 绑定 Service------ Server.addService(Service)
此时若LifecycleState.available == true , Service直接start()

void Tomcat.setConnector 方法

给 Service 绑定 Connector---------- Service.addConnector(Connector)
此时若LifecycleState.available == true , Connector直接start()

org.apache.catalina.Host  Tomcat.getHost() 方法

给Service 绑定 Engine ------- Service.setContainer(Engine)
给 Engine绑定host -------- Engine.addChild(Host)
 

org.apache.catalina.Engine 的实际对象 org.apache.catalina.core.StandardEngine 
org.apache.catalina.Host 的实际对象org.apache.catalina.core.StandardHost
都继承了org.apache.catalina.core.ContainerBase extends LifecycleMBeanBase

org.apache.catalina.connegaoctor.Connector

在构造函数内,按指定的protocol对应的class实例指定的的ProtocolHandler。

重要的成员变量:

  1.  org.apache.coyote.ProtocolHandler 对应不同的协议处理方式
  2.  org.apache.coyote.Adapter:  实际处理对象只有 CoyoteAdapter , 适配当前Connector。
  3. org.apache.catalina.Service extends Lifecycle :  实际处理对象只有 StandardService

void TomcatServletWebServerFactory.prepareContext 方法

  1. 创建org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext (extends org.apache.catalina.core.StandardContext)注入属性值
    (eg. contextPath、displayName 等通过ServletWebServerFactoryCustomizer解析ServerProperties读入的配置文件指定的值)
  2. 给TomcatEmbeddedContext 设置 org.apache.catalina.loader.WebappLoader ( extends LifecycleMBeanBase )实例。
  3. 判定是否需要注册默认的Servlet:  给(实例TomcatEmbeddedContext ) Context 绑定 Servlet 的 Wrapper ---------- Context.addChild(Wrapper)

    这就是为什么Tomcat自带的默认Servlet的名字是"default" ~ 
    Servlet 是由 org.apache.catalina.core.StandardContext.createWrapper() 方法使用默认的org.apache.catalina.core.StandardWrapper 封装:
  4. org.apache.catalina.Host 绑定 TomcatEmbeddedContext ---------- Host.addChild(Context)

void TomcatServletWebServerFactory.configureContext 方法

顾名思义,该方法用来给 TomcatEmbeddedContext 注入属性。不限于以下:

  1. 设置org.springframework.boot.web.embedded.tomcat.TomcatStarter
  2. 设置org.apache.catalina.LifecycleListener
  3. 设置org.springframework.boot.web.embedded.tomcat.TomcatErrorPage
  4. void .configureSession方法设置Cookie | Session 的超时时长

以上是 SpringBoot内嵌tomcat(3)【Tomcat各组件的创建】源码简析 的全部内容, 来源链接: utcz.com/z/514897.html

回到顶部