SpringBoot源码之Tomcat加载原理分析

举报
波波烤鸭 发表于 2022/03/30 00:02:27 2022/03/30
【摘要】 SpringBoot源码之Tomcat加载原理 一、Tomcat基础   我们想要搞清楚在SpringBoot启动中到的是如何集成的Tomcat容器,这个就需要我们先对Tomcat本身要有所了解,...

请添加图片描述

SpringBoot源码之Tomcat加载原理

一、Tomcat基础

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

1.目录结构

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

image.png

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

2.启动流程

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

image.png

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

image.png

查看 startup.bat

image.png

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

image.png

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

image.png

最后会执行的程序是

image.png

image.png

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

image.png

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

3.Bootstrap类

3.1 架构图

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

image.png

3.2 流程分析

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

image.png

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

bootstrap.init(); // 初始化类加载器
bootstrap.load(); // 间接调用Catalina,创建对象树,然后调用生命周期的init方法初始化整个对象树
bootstrap.start(); // 间接调用Catalina的start方法,然后调用生命周期的start方法启动整个对象树

  
 
  • 1
  • 2
  • 3

二、SpringBoot中详解

1.自动装配

  首先我们来看下在spring.factories中注入了哪些和Web容器相关的配置类。

1.1 EmbeddedWebServerFactoryCustomizerAutoConfiguration

  第一个是EmbeddedWebServerFactoryCustomizerAutoConfiguration。

image.png

  查看代码,比较容易

image.png

image.png

在这个配置类里面就是根据我们的配置来内嵌对应的Web容器,比如Tomcat或者Jetty等。

1.2 ServletWebServerFactoryAutoConfiguration

  然后来看下ServletWebServerFactoryAutoConfiguration这个配置类。

image.png

  首先来看下在类的头部引入和一些核心的信息

image.png

  重点我们需要看下EmbeddedTomcat这个内部类。

image.png

  看到的核心其实是创建了一个TomcatServletWebServerFactory对象并注入到了Spring容器中。这块的内容非常重要,是我们后面串联的时候的一个切入点。

2.启动流程

  有了上面的自动配置类的支持我们就可以看看在SpringBoot的run方法中是在哪个位置帮我们内嵌了Tomcat容器呢?首先我们从SpringBoot的run方法的刷新上下文的方法进入。

image.png

  这部分其实就是Spring的核心代码了,我们进入到refresh()方法。

image.png

继续进入:

image.png

  然后我们进入ServletWebServerApplicationContext对象的onRefresh方法中。

image.png

核心方法 createWebServer() 创建我们的Tomcat容器。

image.png

可以看到,从容器中获取的工厂对象其实就我们上面注入的对象,然后根据工厂对象获取到了一个TomcatWebServer实例,也就是Tomcat服务对象。关键点我们需要看下getWebServer方法的逻辑

image.png

image.png

然后继续进入到 getTomcatWebServer方法中。

image.png

进入构造方法查看

image.png

进入Tomcat初始化的方法initialize方法

image.png

进入start方法

image.png

image.png

到这儿后面的逻辑其实就是Tomcat自身启动的逻辑了。这就需要你的Tomcat基础了,到这SpringBoot启动是如何内嵌Tomcat容器的到这儿就结束了哦。

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/122480280

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。