首页 > 其他分享 >SpringBoot中内置Servlet容器原理

SpringBoot中内置Servlet容器原理

时间:2023-09-21 21:35:30浏览次数:42  
标签:容器 内置 SpringBoot Tomcat 方法 Servlet 我们

本篇博客会梳理一下SpringBoot内置Servlet容器的原理:

原理其实跟SpringBoot中的内置Tomcat的启动原理差不多,我们从整个源码进行梳理一下。

我们会发现当我们从Spring,SpringMVC演化到SpringBoot后发现采用SpringBoot后不需要配置Tomcat服务器了,这是什么原因呐,我们启动整个SpringBoot容器后,如果我们不配置相关的端口的参数,会发现整个项目会泡在本地电脑的8080端口,大家有没有想过其中的真实的原因,其实SpringBoot帮我们做了很多事,屏蔽掉了很多底层的细节点,因此我们需要不断的 "抽丝" 揭秘一下SpringBoot到底帮我们做了哪些事情,我们先来看下启动整个SpringBoot项目的主启动类:

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

注意我们在使用springBoot时候会使用到相应的maven依赖,先来查看一下对应的maven依赖:

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

当依赖Spring-boot-starter-web时候会在SpringBoot中添加 ServletWebSeverFactoryAutoConfiguraion.的servlet容器的自动配置类:

image-20230921204449937

  • 该自动给配置类通过@Import导入了可用(通过ConditionOnClass判断决定使用哪一个)web容器工厂(默认Tomcat)

image-20230921204946678

爆红说明暂不支持该服务器的servlet容器

接下来来看下启动流程分析:

image-20230921205421412

当我们在使用启动run方法的时候会调用一个叫createApplicationContext方法,该方法会返回一个容器叫作AnnotationConfigServletWebServerApplicationContext的容器。

之后会调用容器的refresh方法,帮我们去加载IOC容器:

其实是调用的refreshContext方法:

image-20230921210024178

image-20230921205941059

其中refresh中有个方法叫作invokeBeanFactoryPostProcessors()方法他会解析所有@Bean标注的bean,将这些bean标注进来:

image-20230921210513419

接下来他会调用一个叫作onRefresh的方法:

注意此时我们是在AbstractApplicationContext中获取的方法我们会发现该方法什么都没有实现,那么对于成熟的Spring框架肯定不会写一些无用的方法,那么很显然该方法是由AbstractApplicationContext子类来完成实现的:

其中有一个叫ServletWebServerApplicationContext的子类:

image-20230921210824558

然后跟进方法:

image-20230921211047297

注意其中有一个被try...catch....块包裹的函数叫作createWebServer()函数:

image-20230921211153121

然后其中有一个方法叫作getWebServerFactory的方法获取我们所配置的ServletWebServerFactory,还记得我们在invokeBeanFactoryPostProcessors中的将TomcatServletWebServerFactory已经配置进来了:

image-20230921211653250

然后拿到对应的TomcatServletWebServerFactory后会有一个getWebServer方法:

image-20230921211921017

再次点进去就会发现最核心的代码:

image-20230921211958056

然后我们不断点进去getTomcatWebServer方法:Tomcat被启动:

image-20230921212116470

然后挂起等待请求:startDaemonAwaitThread:

image-20230921212310001

完结:

​ 这就是SpringBoot中内置servlet容器的原理!!!

标签:容器,内置,SpringBoot,Tomcat,方法,Servlet,我们
From: https://www.cnblogs.com/liuyuchengcj/p/17721011.html

相关文章

  • 常用的内置模块
    时间模块这个模块我们就比较熟悉了,之前学的时候调用过内部的几个功能三种时间表现形式1.时间戳(timestamp)返回秒数。通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。2.结构化时间(struct_time)主要是给......
  • Python 内置数据类型详解
    内置数据类型在编程中,数据类型是一个重要的概念。变量可以存储不同类型的数据,不同类型可以执行不同的操作。Python默认内置了以下这些数据类型,分为以下几类:文本类型:str数值类型:int、float、complex序列类型:list、tuple、range映射类型:dict集合类型:set、frozenset布尔类型......
  • SpringBoot疫苗在线预约接种系统
    SpringBoot疫苗在线预约接种系统系统功能首页:图片轮播宣传疫苗列表在线预约疫苗新闻资讯新闻详情登录注册留言板个人中心我的预约后台管理:登录新闻管理留言板管理回复管理预约管理用户管理疫苗库管理系统管理用户管理角色管理日志管理操作日志登录日志......
  • servlet
    一、概述 Servlet是一种独立于平台和协议的服务器端的Java应用程序,可以生成动态的Web页面。  Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。 ......
  • web开发:详细讲解jsp的内置对象
    1.request对象   客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。序号方法说明1objectgetAttribute(Stringname)返回指定属性的属性值2EnumerationgetAttributeNames()返回所有可用属性名的......
  • springboot 的 properties 文件之间的联系
    application.properties为全局配置文件,默认加载这里的内容application-dev.properties为开发配置文件,会覆盖全局配置文件内容application-test.properties为测试配置文件,会覆盖全局配置文件application-prod.properties为线上配置文件,同上同样yaml与properties的相......
  • oracle 内置函数备忘录
    这两天在写oracle包,蛮大的一个,为了方便查找,就丢上来个。黄色是经常用到的,顺便看看对大家有没有帮助。  SQL中的单记录函数1.ASCII返回与指定的字符对应的十进制数;SQL>selectascii('A')A,ascii('a')a,ascii('0')zero,ascii('')spacefromdual;       A    ......
  • springBoot 启动报错: If you want an embedded database (H2, HSQL or Derby), please
    原因其实这个异常在SpringBoot中是一个比较常见的异常,一般是因为SpringBoot自动配置时,检测到我们添加了MySQL、Oracle、Mybatis等和数据库相关的依赖包,结果我们的配置文件中却没有添加数据库相关的配置,比如:spring:datasource:driver-class-name:com.mysql.jdbc.Driver......
  • IDEA想要导入servletjar包却找不到
    在创建项目的时候,把web、tomcat都配置好后,在类中想要extendsHttpServlet却爆红找不到import的包 先打开file-->projectstructure-->Libraries 找到tomcat,lib下的servlet-api即可 ......
  • Springboot 的 maven项目利用 maven插件构建 docker 镜像(免 DockerFile编写)
    Springboot的maven项目利用maven插件构建docker镜像(免DockerFile编写)本小节目的是springboot项目maven插件构建容器实验步骤:1.本地创建springboot项目,写业务逻辑代码2.提交代码到远程git仓库3.在linux环境拉取远程git仓库代码,构建镜像4.把构建完成的镜像推送......