SpringBoot源码之Tomcat加载原理
一、Tomcat基础
我们想要搞清楚在SpringBoot启动中到的是如何集成的Tomcat容器,这个就需要我们先对Tomcat本身要有所了解,不然这个就没办法分析了,所以我们先来回顾下Tomcat的基础内容。Tomcat版本是8.5.73
1.目录结构
先简单的回顾下一个Tomcat文件的目录结构
这个非常基础和简单就快速过掉。
2.启动流程
Tomcat的架构相关的内容在本文中就不再赘述,可以查阅Tomcat源码专题的内容,我们来看下当我们要启动一个Tomcat服务,我们其实是执行的bin目录下的脚本程序,startup.bat
和 startup.sh
.一个是windows的脚本,一个是Linux下的脚本,同样还可以看到两个停止的脚本 shutdown.bat
和 shutdown.sh
.
为了比较直观的来查看脚本的内容,我们通过VCCode来查看吧。
查看 startup.bat
可以看到在这个脚本中调用了 catalina.bat
这个脚本文件,继续进入,配置信息很多,找核心的脚本
对应的我们进入到doStart方法中
最后会执行的程序是
而这个MAINCLASS变量是前面定义的有的
其实前面看了这么一堆的脚本文件,都是在做一些环境的检测和运行时的参数,最终执行的是Bootstrap中的main方法。
3.Bootstrap类
3.1 架构图
在分析具体的源码流程之前还是需要对Tomcat的架构图要有所了解的
3.2 流程分析
接下来我们需要查看下Bootstrap中的main方法了,这时我们需要下载对应的源码文件了。可以官网自行下载,也可以在课件资料中找到。
本文不详解介绍,只为SpringBoot中内容做铺垫。
代码语言:javascript复制bootstrap.init(); // 初始化类加载器
bootstrap.load(); // 间接调用Catalina,创建对象树,然后调用生命周期的init方法初始化整个对象树
bootstrap.start(); // 间接调用Catalina的start方法,然后调用生命周期的start方法启动整个对象树
二、SpringBoot中详解
1.自动装配
首先我们来看下在spring.factories中注入了哪些和Web容器相关的配置类。
1.1 EmbeddedWebServerFactoryCustomizerAutoConfiguration
第一个是EmbeddedWebServerFactoryCustomizerAutoConfiguration。
查看代码,比较容易
在这个配置类里面就是根据我们的配置来内嵌对应的Web容器,比如Tomcat或者Jetty等。
1.2 ServletWebServerFactoryAutoConfiguration
然后来看下ServletWebServerFactoryAutoConfiguration这个配置类。
首先来看下在类的头部引入和一些核心的信息
重点我们需要看下EmbeddedTomcat这个内部类。
看到的核心其实是创建了一个TomcatServletWebServerFactory对象并注入到了Spring容器中。这块的内容非常重要,是我们后面串联的时候的一个切入点。
2.启动流程
有了上面的自动配置类的支持我们就可以看看在SpringBoot的run方法中是在哪个位置帮我们内嵌了Tomcat容器呢?首先我们从SpringBoot的run方法的刷新上下文的方法进入。
这部分其实就是Spring的核心代码了,我们进入到refresh()方法。
继续进入:
然后我们进入ServletWebServerApplicationContext对象的onRefresh方法中。
核心方法 createWebServer() 创建我们的Tomcat容器。
可以看到,从容器中获取的工厂对象其实就我们上面注入的对象,然后根据工厂对象获取到了一个TomcatWebServer实例,也就是Tomcat服务对象。关键点我们需要看下getWebServer方法的逻辑
然后继续进入到 getTomcatWebServer方法中。
进入构造方法查看
进入Tomcat初始化的方法initialize方法
进入start方法
到这儿后面的逻辑其实就是Tomcat自身启动的逻辑了。这就需要你的Tomcat基础了,到这SpringBoot启动是如何内嵌Tomcat容器的到这儿就结束了哦。