当前位置:首页 > 科技  > 软件

深入剖析SpringBoot底层原理

来源: 责编: 时间:2023-11-20 17:11:52 173观看
导读作者 | 波哥审校 | 重楼记得差不多在2015年以前,要部署一个Web应用,那得准备各种Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目录下,以此来完成一个应用的部署,而且应用中的web.xml配置文件是必不可少的。可是

作者 | 波哥J2e28资讯网——每日最新资讯28at.com

审校 | 重楼J2e28资讯网——每日最新资讯28at.com

记得差不多在2015年以前,要部署一个Web应用,那得准备各种Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目录下,以此来完成一个应用的部署,而且应用中的web.xml配置文件是必不可少的可是近几年使用了SpringBoot后,发现写一个Web应用真的太简单了,一个SpringBootApplication注解直接搞定,什么web.xml啥都不用了,干净利索。J2e28资讯网——每日最新资讯28at.com

对于SpringBoot,我想99.99%的老铁都会使用,但是又有几人知道为什么加了这么一个简单的注解,一个Web应用就这么轻松的被创建出来了呢?今天我们就来扒一扒它的神秘面纱。J2e28资讯网——每日最新资讯28at.com

先来说说SpringBoot的几大核心能力,包括:自动装配、内置Web容器以及整合SpringMVC因此笔者本篇主要从上述三个维度来详细阐述它的底层原理。J2e28资讯网——每日最新资讯28at.com

先通过一张图来说明下SpringBoot启动的整体流程:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

我们研究任何源码,首先得找到它的入口,SpringBoot的入口毫无疑问是SpringApplication.run方法,找到了入口,然后顺藤摸瓜看看SpringBoot是如何实现上述的三大核心能力的。J2e28资讯网——每日最新资讯28at.com

1. 自动装配

那么什么是自动装配?笔者看来自动装配就像是搭积木,将多种形状的模型组装在一起,对应SpringBoot中的自动装配则是将单独的第三方功能,组装到Spring这个大的容器中,让Spring可以全权管理所涉及到的Bean实例,并在整个项目中使用。J2e28资讯网——每日最新资讯28at.com

我们还是从入口入手。我们可以想下,SpringBoot肯定是需要使用到Spring的核心能力的,而Spring的核心能力就是如何管理Bean的生命周期,那就肯定脱离不了Spring的应用上下文,但是我们在使用SpringBoot的过程中,从头到尾都没有明确创建过Spring应用上下文。于是我们有理由相信,一定是在SpringApplication的run方法中创建了这个Spring的应用上下文,而事实上的确如此:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

上述代码中,创建了AnnotationConfigServletWebServerApplicationContext,该类是SpringBoot实现的应用上下文,它是GenericApplicationContext的子类:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

很明显,它具有Spring应用上下文的一切能力。在创建出了Spring应用上下文后,接下来肯定就是去扫描需要被Spring管理的类,得到BeanDefinition信息,然后完成Bean的生命周期管理。关于Bean的生命周期管理,笔者已经写了系列文章,感兴趣的童鞋可以去看看。这里我们只谈SpringBoot是如何完成自动装配的。J2e28资讯网——每日最新资讯28at.com

咱们顺着SpringBootApplication注解,可以发现在EnableAutoConfiguration注解上有Import({AutoConfigurationImportSelector.class}的注解信息,Spring会调用AutoConfigurationImportSelector的selectImports方法,将该方法返回的所有字符串对应的类,走Bean的生命周期流程并进行管理:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

那么这个方法返回的字符串数组就是自动装配的玄机所在,咱们看看它的具体代码实现就一目了然了:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

简单来说说上述代码:

顺着getCandidateConfigurations方法看:J2e28资讯网——每日最新资讯28at.com

调用loadSpringFactories方法,读取所有META-INF/spring.factories目录中的配置信息,返回配置信息中key为EnableAutoConfiguration类型的value值,然后筛选出非exclusions的值,就得到了将要被返回的所有字符串数组的数据。J2e28资讯网——每日最新资讯28at.com

所以一句话来回答SpringBoot是如何实现自动装配的呢?

很简单,Spring就是读取项目中所有的META-INF/spring.factories配置文件信息,然后加载EnableAutoConfiguration对应的value值。既然Spring已经加载了这些value值到上下文容器中,那就可以使用这些value对应的Bean做为桥梁,来加载更多的其他Bean。J2e28资讯网——每日最新资讯28at.com

如果老铁们自己实现了一些工具包,也想自动整合进来,也完全可以增加一个META-INF/spring.factories的配置文件作为桥梁来实现,so easy,有木有?J2e28资讯网——每日最新资讯28at.com

2. 内置Web容器

上述Spring已经加载到了EnableAutoConfiguration对应的value值在SpringBoot自己提供的spring.factories文件中,默认支持了一堆的值,这些都是SpringBoot默认提供的自动装配类(也可以理解为桥梁类),其中有一个名为:ServletWebServerFactoryAutoConfiguration的配置类,这个配置类中导入了EmbeddedTomcat:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

而EmbeddedTomcat这个类中又通过@Bean注解配置了
TomcatServletWebServerFactory:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

看英文就大概知道了,这个类是用来创建Tomcat的工厂类,它是ServletWebServerFactory接口的实现类:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

这表明在Spring应用上下文容器中已经存在了类型为ServletWebServerFactory的Bean大家记住这个很重要,因为接下来在创建容器的时候就要用到这个Bean。J2e28资讯网——每日最新资讯28at.com

具体来看看是怎么链接的。

在上面我们说过SpringBoot会创建一个AnnotationConfigServletWebServerApplicationContext的Spring应用上下文,Spring在执行应用上下文的refresh方法时,会执行onRefresh方法,来执行子上下文的逻辑:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

而这个子上下文的onRefresh方法则是执行createWebServer方法创建Web服务,也就是咱们所说的Tomcat:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

原来如此,这里在createWebServer方法中会从Spring的Bean工厂中获取到ServletWebServerFactory的实例,而这个实例不就是我们上面提到的TomcatServletWebServerFactory类型的实例吗?获取到这个ServletWebServerFactory实例后,调用它的getWebServer方法来创建一个Web服务:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

没错,就是直接创建一个Tomcat。呵呵,大功告成!J2e28资讯网——每日最新资讯28at.com

3. 整合SpringMVC

话说,在使用SpringBoot时,写一个Controller和在SpringMVC中方法一一样,那这个又是咋做到的呢?J2e28资讯网——每日最新资讯28at.com

还是看SpringBoot自己提供的spring.factories文件,其中有一个名为DispatcherServletAutoConfiguration的自动配置类,这个类就是那个连接SpringBoot和SpringMVC的桥梁。J2e28资讯网——每日最新资讯28at.com

我们知道,SpringMVC里面一个核心类就是DispatcherServlet,所以我们完全可以大胆的猜想,在这个自动配置类,一定配置了DispatcherServlet,事实上也确实如此:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

有了这个类,一切就水到渠成?不,还没有渠成,虽然有了这个Bean实例,但是它是如何和Tomcat容器对接上的还没弄清楚,不是吗?J2e28资讯网——每日最新资讯28at.com

在上述getWebServer方法中,创建好Tomcat容器后,后面会继续执行prepareContext方法:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

在该方法中调用configureContext创建TomcatStarter,并且添加到了Tomcat上下文中,而这个TomcatStarter是ServletContainerInitializer的实现类:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

在Servlet3.0的规范里面明确,在Web容器启动完成后会调用ServletContainerInitializer实现类的onStartup方法,于是就会进入TomcatStarter的onStartup方法:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

该方法中会执行所有ServletContextInitializer类型的onStartup方法,那这个ServletContextInitializer对象是啥?我们在DispatcherServletAutoConfiguration中可以看到配置了DispatcherServletRegistrationBean实例,这个就是ServletContextInitializer的实现类:J2e28资讯网——每日最新资讯28at.com

J2e28资讯网——每日最新资讯28at.com

于是就会调用DispatcherServletRegistrationBean的onStartup方法,从而向Web容器上下文中注册DispatcherServlet,并配置Mapping映射(默认将“/*”映射到DispatcherServlet)。J2e28资讯网——每日最新资讯28at.com

以上就是SpringBoot的底层原理分析,希望能对老铁们有所帮助!J2e28资讯网——每日最新资讯28at.com

作者介绍

波哥,互联行业从业10余年,先后担任项目总监及架构师。目前专攻技术,喜欢研究技术原理。技术全面,主攻Java,精通JVM底层机制及Spring全家桶底层框架原理,熟练掌握当前主流的中间件、服务网格等技术原理。J2e28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-31547-0.html深入剖析SpringBoot底层原理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 各类语言真实性能比较列表

下一篇: 面试官:网关如何实现限流?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 一文看懂为苹果Vision Pro开发应用程序

    一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 微信语音大揭秘:为什么禁止转发?

    微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 从零到英雄:高并发与性能优化的神奇之旅

    从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    小红书1周涨粉49W+,我总结了小白可以用的N条涨粉笔记

    作者:黄河懂运营一条性教育视频,被54万人“珍藏”是什么体验?最近,情感博主@公主是用鲜花做的,火了!仅仅凭借一条视频,光小红书就有超过128万人,为她疯狂点赞!更疯狂的是,这
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein“利用市场支配力量强迫服装厂商与之签订独家
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
Top
Baidu
map