详解SpringBoot内嵌Tomcat容器的创建

前续

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

正文

在上一篇中,我们分析了为什么在SpringBoot的WEB应用中,会自动启动内嵌的Tomcat服务器。现在我们来具体看看SpringBoot到底是如何创建Tomcat服务器的。

No.1 创建WEB服务器

首先定位到创建WEB服务器的代码,具体如下:

这里的factory是TomcatServletWebServerFactory,来看看它的getWebServer方法,具体代码如下:

1.1、创建内嵌Tomcat容器

Tomcat类是用于嵌入/单元测试的最小tomcat启动器,主要是嵌入tomcat的应用程序。

1.2、配置tomcat的访问引擎

1.3、配置tomcat的应用上下文

调用prepareContext方法,其代码如下:

prepareContext方法主要是构建内嵌tomcat容器的应用上下文,从而初始化TomcatWebServer。

1.4、创建TomcatWebServer

调用getTomcatWebServer方法,具体代码如下:

直接创建TomcatWebServer,具体代码如下:

TomcatWebServer可用于控制Tomcat Web服务器的WebServer。通常,此类应使用TomcatServletWebServerFactory的TomcatReactiveWebServerFactory创建,但不能直接创建。

重点看看initialize方法,具体代码如下:

打印Tomcat服务器初始化日志信息,在控制台中可以看到如下信息:

修正Tomcat引擎名称

如果当前实例ID值大于0,则将实例ID拼接到引擎名中,如:engineName+"-"+instanceId

获取Tomcat的应用上下文

遍历tomcat的子容器,获取tomcat的应用上下文对象

添加事件监听

删除服务连接器,以便在启动服务时不会发生协议绑定。

启动Tomcat服务器

在控制台中可以看到如下日志信息:

重新抛出失败异常

如果存在Tomcat的启动异常,则抛出该异常信息

将命名上下文绑定到类加载器

就是将context绑定到Hashtable中,具体代码如下:

创建一个非守护进程

因为tomcat的所有进程都是守护进程,因此需要创建一个非守护进程来停止Tomcat服务进程,具体代码如下:

这样这个Tomcat服务器就创建并启动完成。

No.2 初始化WEB服务器的环境配置

WEB服务器构建成功后,接下来就是初始化其环境配置:

具体来其代码实现:

调用StandardServletEnvironment.initPropertySources方法,具体代码如下:

继续查看initServletPropertySources方法,具体代码如下:

将基于Servlet的存根属性源替换为使用给定的servletContext和servletConfig对象填充的实际实例。

替换servletContextInitParams的属性源

将servletContextInitParams的属性源替换为ServletContextPropertySource

替换servletConfigInitParams的属性源

将servletConfigInitParams的属性源替换为ServletConfigPropertySource

后记

为帮助广大SpringBoot用户达到“知其然,更需知其所以然”的境界,作者将通过SpringBoot系列文章全方位对SpringBoot2.0.0.RELEASE版本深入分解剖析,让您深刻的理解其内部工作原理。

本系列历史文章列表

·end·

—如果喜欢,快分享给你的朋友们吧—

我们一起愉快的玩耍吧

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180718G1IYV500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券