浅谈SpringBoot内嵌Tomcat的实现原理解析

 更新时间:2020年12月20日 16:57:59   作者:无聊的洪某人  
这篇文章主要介绍了浅谈SpringBoot内嵌Tomcat的实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、序言

使用SpringBoot经常会使用内嵌的tomcat做为项目的启动容器,本文将从源码的角度出发,剖析SpringBoot内嵌Tomcat的实现原理,讨论Tomcat何时创建、何时启动以及怎么启动。

二、引入Tomcat组件

导入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

项目启动:

@SpringBootApplication
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

以上是一段常见的SpringBoot项目依赖和启动的代码。引入spring-boot-starter-web同时会默认引入spring-boot-starter-tomcat,即Tomcat启动的相关环境。而对于项目启动代码,@SpringBootApplication主要实现Spring组件扫描和自动配置。该注解是复合注解,其中@EnableAutoConfiguration本身也是一个复合注解,包含以下内容:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

这两个注解比较关键。@AutoConfigurationPackage主要实现自动配置包,会扫描@SpringbootApplication标注的类所在包名及其子包,将创建的组件添加到容器中;而@Import则是导入了AutoConfigurationImportSelector.class,实现查找classpath上所有jar包中的META-INF/spring.factories,找出其中的自动配置类并导入到容器中,其中Web容器所对应的自动配置类为ServletWebServerFactoryAutoConfiguration。

在这里插入图片描述

ServletWebServerFactoryAutoConfiguration中支持好几种web容器,比如Tomcat、Jetty和Undertow。

在这里插入图片描述

而EmbeddedTomcat则是Tomcat组件相关的类,本身是一个FactoryBean,用来实例化TomcatServletWebServerFactory。此时TomcatServletWebServerFactory中就包含了创建和启动Tomcat的方法getWebServer()。

在这里插入图片描述

三、Tomcat组件启动

SpringBoot是在项目启动的时候才同时启动Tomcat的,很显然getWebServer()是在项目启动的过程中调用的。跟踪SpringApplication的run(),其中存在refreshContext(context),此时主要完成容器的刷新。

在这里插入图片描述

容器刷新跟踪到最后是AbstractApplicationContext中的onRefresh(),显然这是一个钩子函数,应用了模板方法,查看所有的实现方法,其中有一个ServletWebServerApplicationContext,则是当前Web容器的实现。

在这里插入图片描述

而ServletWebServerApplicationContext中主要是去获得ServletWebServerFactory对象,同时调用getWebServer创建WebServer对象。

在这里插入图片描述

此时,主要处理的是Tomcat容器对象的创建、环境配置和启动。

在这里插入图片描述

在这里插入图片描述

四、总结

到这里,基本就走完了内嵌Tomcat创建启动的整个流程。其实核心主要还是依赖于SpringBoot的自动配置。项目启动的过程中,扫描classpath下的META-INF/spring.factories,实例化工厂对象TomcatServletWebServerFactory,在调用run()方法的时候完成Tomcat对象的创建,环境设置和启动,从而实现Tomcat容器的自动化处理。

到此这篇关于浅谈SpringBoot内嵌Tomcat的实现原理解析的文章就介绍到这了,更多相关SpringBoot内嵌Tomcat内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 实例分析java对象的序列化和反序列化

    实例分析java对象的序列化和反序列化

    序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化
    2018-09-09
  • Mybatis如何一次性插入多条数据

    Mybatis如何一次性插入多条数据

    这篇文章主要介绍了Mybatis如何一次性插入多条数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring整合Mybatis具体代码实现流程

    Spring整合Mybatis具体代码实现流程

    这篇文章主要介绍了Spring整合Mybatis实操分享,文章首先通过介绍Mybatis的工作原理展开Spring整合Mybatis的详细内容,需要的小伙伴可以参考一下
    2022-05-05
  • 教你一步到位部署运行MyBatis3源码(保姆级)

    教你一步到位部署运行MyBatis3源码(保姆级)

    一个框架的运行流程从最简单的一个helloworld来看其源码就能了解到框架的原理是什么,这篇文章主要给大家介绍了关于如何一步到位部署运行MyBatis3源码的相关资料,需要的朋友可以参考下
    2022-06-06
  • Springboot 读取 yml 配置文件里的参数值

    Springboot 读取 yml 配置文件里的参数值

    本文主要介绍了Springboot 读取 yml 配置文件里的参数值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • JAVA线程sleep()和wait()详解及实例

    JAVA线程sleep()和wait()详解及实例

    这篇文章主要介绍了JAVA线程sleep()和wait()详解及实例的相关资料,探讨一下sleep()和wait()方法的区别和实现机制,需要的朋友可以参考下
    2017-05-05
  • Mybatis的mapper标签 namespace属性用法说明

    Mybatis的mapper标签 namespace属性用法说明

    这篇文章主要介绍了Mybatis的mapper标签 namespace属性用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Spring Boot整合swagger使用教程详解

    Spring Boot整合swagger使用教程详解

    这篇文章主要介绍了Spring Boot整合swagger使用教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • PowerShell用户认证Function实例代码

    PowerShell用户认证Function实例代码

    这篇文章主要介绍了PowerShell用户认证Function的资料,并附实例代码,帮助大家学习理解,有需要的小伙伴可以参考下
    2016-09-09
  • ssm 使用token校验登录的实现

    ssm 使用token校验登录的实现

    这篇文章主要介绍了ssm 使用token校验登录的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论