首页 > 其他分享 >20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

时间:2024-09-23 13:23:03浏览次数:3  
标签:Web 20 Tomcat 容器 Spring Boot Context 搞懂 加载

ContainerLess理念

微服务把应用和它所依赖的组件包、配置文件及附带的运行脚本打包成一个单一、独立、可执行的jar包文件。

在实现Web服务器时,几乎不需要任何配置就可以启动Tomcat。你只需要使用java-jar命令就可以让Tomcat成为Spring Boot的一个自包含的可运行组件和单元。同时,这种自带容器的运行部署方式对云开发环境天然友好。在Spring Boot启动流程和容器配置中,其实我们已经介绍了一点内嵌Tomcat容器的原理,下面具体看一下Spring Boot加载Tomcat的具体执行步骤。

1.Spring Boot引入Tomcat依赖

当我们在项目中加入org.springframework.boot、spring-bootstarter-web等依赖后,Maven会把Tomcat依赖的一些jar包组件也加载进来。

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

2.创建Web容器的Context

在Spring Boot的run方法中,我们发现其中Web容器加载很重要的一步就是下面的代码:创建、加载、刷新、运行Spring容器的

ConfigurableApplicationContext模块。

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

在经历过Context的创建及Context的一系列初始化步骤之后,调用Context的refresh方法。

它最终会调用

AnnotationConfigEmbeddedWebApplicationContext 类 的 refresh 方法,并由其父类EmbeddedWebApplicationContext执行刷新,源码如下:

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

3.创建Tomcat实例

这里我们继续跟进

createEmbeddedServletContainer方法,获得一个嵌入式的容器工厂类:EmbeddedServletContainerFactory。它是一个抽象工厂类,你可以根据不同的容器类型选择不同的容器加载实现。Spring Boot的默认容器是Tomcat,其工厂类实现了Tomcat实例的加载,代码如下:

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

在prepareContext方法中,可以将默认的JSP和Servlet Bean组件加载到Spring容器,并对所有ServletContextInitializer进行合并,然后利用合并后的初始化类对Context进行配置,代码如下:

20年架构师用一文带你彻底搞懂SpringBoot嵌入式Web容器原理

4.Tomcat初始化

下面是Tomcat的正式初始化过程,从tomcat.start方法开始,Tomcat实例开始运行。

标签:Web,20,Tomcat,容器,Spring,Boot,Context,搞懂,加载
From: https://blog.51cto.com/u_17015008/12088720

相关文章

  • 打卡信奥刷题(784)用Scratch图形化工具信P6488[普及组/提高组] [COCI2010-2011#6] OKUPL
    [COCI2010-2011#6]OKUPLJANJE题目描述一场巨大的派对结束以后,有五家报纸刊登了参加这场派对的人数,然而这些报纸上的数字可能是错误的。现在你知道整个会场的面积是LL......
  • [答疑]《分析模式》2020中译本翻译水平怎样
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集albert2024-9-1920:16学习了多集您做的分析模式视频,发现在比对环节2004版普遍比2020版正确。是否可以得出结论2004版本更好?我现在学习用2020版,是否需要找一个老版本,或者老师推荐一些......
  • 2024年华为杯研究生数学建模竞赛C题 波形机理建模+GBDT 进阶完整文章+代码+高级可视化
    2024年华为杯研究生数学建模竞赛C题波形机理建模+GBDT完整文章代码|进阶可视化全部问题已经更新完成,可视化图表20余张,代码量千余行,实在累到了…由于篇幅原因,此处放出部分内容供参考~完整内容可以从底部名片的群中获取~问题重述该题目围绕磁性元件的磁芯损耗建模......
  • 2024 IDEA开发者部署lilishop的manager模块(详尽版)
    一、环境整合构建工具(参考工具部署方式)软件名称版本相关文章推荐Git13.5.0https://www.cnblogs.com/liuyangfirst/p/15996063.htmlNodeJS16.0.0https://www.cnblogs.com/liuyangfirst/p/15998172.htmlJDK1.8https://www.cnblogs.com/liuyangfirst/p/143......
  • 2024ICPC网络赛第二场题解(部分)
    前言这场相对作用大一点,最后顶着队友的怀疑压力乱搞出了C,但是后面看题解发现似乎是数据弱了跑过去,其实复杂度是队友分析的那样,是不正确的,但是毕竟是打名额的比赛,过了就是过了,这里分享一下C题的乱搞做法,以及其他题的我们队赛时代码。下面的顺序按过题顺序(也差不多是难度递增顺序)......
  • 20240814
    Sternhalma我们给格子编个号,然后暴力打表出一个格子可以走到哪些点,然后状压\(dp\),从全\(1\)的情况开始倒推,每次查询将其转化为二进制数列即可#include<bits/stdc++.h>usingnamespacestd;usingpii=pair<int,int>;constintN=21,M=(1<<19);intq,n......
  • 20240813
    Goals,Goals!Everywhere先考虑最大的情况,那就是没有助攻,全是进球,观察样例,发现好像最小进球数好像就是最大数除以\(2\),但是有一种特殊情况,就是最大的那个球员比剩下的球员加起来还多(C罗和国足)#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong......
  • 基于gin的web开发脚手架模版
    一、web开发模式1.传统的MVC模式:这个模式不太适合大型的web应用。2.CLD模式链接:https://github.com/Ruan0423/gin-web-Framework二、目录结构--web_app -controller -logic -dao -mysql -redis -models -pkg -settings settings.go -routers router.go ma......
  • 20240808
    Increase/Decrease/Copy我们可以先将\(a_i\)变为\(b_i\),统计在变化的过程中与\(b_{i+1}\)的最少差值即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+5;intt,n,a[N],b[N];voidSolve(){cin>>n;for(i......
  • 【专题】2024新能源企业“出海”系列之驶向中东、东南亚报告合集PDF分享(附原数据表)
    在“双碳”目标引领下,中国新能源产业近年迅猛发展,新能源企业凭借技术革新、政策支持与市场驱动实现快速增长,在产业链完备、技术领先、生产效能及成本控制等方面优势显著。面对国内外环境不确定性增强的常态化态势,中国新能源企业积极开拓海外市场,开启“出海”征程。中东地区凭借独特......