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。
重要的成员变量:
- org.apache.coyote.ProtocolHandler 对应不同的协议处理方式
- org.apache.coyote.Adapter: 实际处理对象只有 CoyoteAdapter , 适配当前Connector。
- org.apache.catalina.Service extends Lifecycle : 实际处理对象只有 StandardService
void TomcatServletWebServerFactory.prepareContext 方法
- 创建org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedContext (extends org.apache.catalina.core.StandardContext)注入属性值
(eg. contextPath、displayName 等通过ServletWebServerFactoryCustomizer解析ServerProperties读入的配置文件指定的值) - 给TomcatEmbeddedContext 设置 org.apache.catalina.loader.WebappLoader ( extends LifecycleMBeanBase )实例。
- 判定是否需要注册默认的Servlet: 给(实例TomcatEmbeddedContext ) Context 绑定 Servlet 的 Wrapper ---------- Context.addChild(Wrapper)
这就是为什么Tomcat自带的默认Servlet的名字是"default" ~
Servlet 是由 org.apache.catalina.core.StandardContext.createWrapper() 方法使用默认的org.apache.catalina.core.StandardWrapper 封装: - org.apache.catalina.Host 绑定 TomcatEmbeddedContext ---------- Host.addChild(Context)
void TomcatServletWebServerFactory.configureContext 方法
顾名思义,该方法用来给 TomcatEmbeddedContext 注入属性。不限于以下:
- 设置org.springframework.boot.web.embedded.tomcat.TomcatStarter
- 设置org.apache.catalina.LifecycleListener
- 设置org.springframework.boot.web.embedded.tomcat.TomcatErrorPage
- void .configureSession方法设置Cookie | Session 的超时时长
以上是 SpringBoot内嵌tomcat(3)【Tomcat各组件的创建】源码简析 的全部内容, 来源链接: utcz.com/z/514897.html