前续
为帮助广大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·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的玩耍吧
领取专属 10元无门槛券
私享最新 技术干货