SpringBoot源码之Tomcat加载原理分析

Posted 波波烤鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot源码之Tomcat加载原理分析相关的知识,希望对你有一定的参考价值。

SpringBoot源码之Tomcat加载原理

一、Tomcat基础

  我们想要搞清楚在SpringBoot启动中到的是如何集成的Tomcat容器,这个就需要我们先对Tomcat本身要有所了解,不然这个就没办法分析了,所以我们先来回顾下Tomcat的基础内容。Tomcat版本是8.5.73

1.目录结构

  先简单的回顾下一个Tomcat文件的目录结构

  这个非常基础和简单就快速过掉。

2.启动流程

  Tomcat的架构相关的内容在本文中就不再赘述,可以查阅Tomcat源码专题的内容,我们来看下当我们要启动一个Tomcat服务,我们其实是执行的bin目录下的脚本程序,startup.batstartup.sh.一个是windows的脚本,一个是Linux下的脚本,同样还可以看到两个停止的脚本 shutdown.batshutdown.sh.

  为了比较直观的来查看脚本的内容,我们通过VCCode来查看吧。

查看 startup.bat

可以看到在这个脚本中调用了 catalina.bat这个脚本文件,继续进入,配置信息很多,找核心的脚本

对应的我们进入到doStart方法中

最后会执行的程序是

而这个MAINCLASS变量是前面定义的有的

其实前面看了这么一堆的脚本文件,都是在做一些环境的检测和运行时的参数,最终执行的是Bootstrap中的main方法。

3.Bootstrap类

3.1 架构图

  在分析具体的源码流程之前还是需要对Tomcat的架构图要有所了解的

3.2 流程分析

  接下来我们需要查看下Bootstrap中的main方法了,这时我们需要下载对应的源码文件了。可以官网自行下载,也可以在课件资料中找到。

  本文不详解介绍,只为SpringBoot中内容做铺垫。

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容器的到这儿就结束了哦。

以上是关于SpringBoot源码之Tomcat加载原理分析的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot源码分析之bootstrap.properties文件加载的原理

SpringBoot源码解析:tomcat启动分析

SpringBoot源码之属性文件加载原理剖析

SpringBoot源码之属性文件加载原理剖析

Spring Boot 2从入门到入坟 | Web场景开发篇:源码分析之静态资源配置原理

#yyds干货盘点#自定义spring boot starter三部曲之三:源码分析spring.factories加载过程