我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解SpringBoot底层原理实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解SpringBoot底层原理实现

对于SpringBoot,我想99.99%的老铁都会使用,但是又有几人知道为什么加了这么一个简单的注解,一个Web应用就这么轻松的被创建出来了呢?今天笔者就来扒一扒它的神秘面纱。

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

先通过一张图来说明下SpringBoot启动的整体流程:

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

1. 自动装配

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

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

上述代码中,创建了AnnotationConfigServletWebServerApplicationContext,该类是SpringBoot实现的应用上下文,它是GenericApplicationContext的子类:

很明显,它具有Spring应用上下文的一切能力。在创建出了Spring应用上下文后,接下来就是去扫描需要被Spring管理的类,得到BeanDefinition信息,然后完成Bean的生命周期管理。

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

那么,这个方法返回的字符串数组就是自动装配的玄机所在,咱们看看它的具体代码实现就一目了然了:

简单来说说上述代码:

顺着getCandidateConfigurations方法看:调用loadSpringFactories方法,读取所有META-INF/spring.factories目录中的配置信息,返回配置信息中key为EnableAutoConfiguration类型的value值,然后筛选出非exclusions的值,就得到了将要被返回的所有字符串数组的数据。

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

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

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

2. 内置Web容器

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

而EmbeddedTomcat这个类中又通过@Bean注解配置了TomcatServletWebServerFactory:

这个类是用来创建Tomcat的工厂类,它是ServletWebServerFactory接口的实现类:

这表明在Spring应用上下文容器中已经存在了类型为ServletWebServerFactory的Bean,大家记住这个很重要,因为接下来在创建容器的时候就要用到这个Bean。

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

在上面我们说过,SpringBoot会创建一个AnnotationConfigServletWebServerApplicationContext的Spring应用上下文,Spring在执行应用上下文的refresh方法时,会执行onRefresh方法,来执行子上下文的逻辑:

而这个子上下文的onRefresh方法则是执行createWebServer方法创建Web服务,也就是咱们所说的Tomcat:

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

没错,就是直接创建一个Tomcat。呵呵,大功告成!

3. 整合SpringMVC

话说,在使用SpringBoot时,写一个Controller和在SpringMVC中的方法一模一样,那这个又是怎么做到的呢?

还是看SpringBoot自己提供的spring.factories文件,其中有一个名为DispatcherServletAutoConfiguration的自动配置类,这个类就是那个连接SpringBoot和SpringMVC的桥梁。

我们知道,SpringMVC里面一个核心类就是DispatcherServlet,所以我们完全可以大胆的猜想,在这个自动配置类,一定配置了DispatcherServlet,事实上也确实如此:

有了这个类,一切就水到渠成。

作者介绍

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


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解SpringBoot底层原理实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解SpringBoot底层原理实现

笔者记得差不多在2015年以前,要部署一个Web应用,那得准备各种Web容器,比如Tomcat,然后打war包,然后部署到Web容器的特定目录下,以此来完成一个应用的部署,而且应用中的web.xml配置文件是必不可少的。可是近几年使用了Sp

详解 HashMap 的底层实现原理

作为一名程序员,你可能经常使用 HashMap 这个重要的数据结构,但你对它的底层实现原理可能不够了解。本文将通过图文结合的方式,为你详细解析 HashMap 的底层实现原理,并回答一些常见问题,让你能够更好地理解和应用 HashMap。

深入详解Vue3ref底层实现原理

随着现在vue3越来越普及,相应的面试题也多了起来。说到vue3的面试题,有一个最经典的就是对于实现ref和reactive这两个方法的底层原理,本文就来和大家简单讲讲吧
2023-05-17

SpringCloud网关Zuul底层实现原理详解

Zuul实现是基于Servlet这种阻塞是IO这种机制是通过创建更多的线程来弥补其不足;而Cloud Gateway则是基于反应式非阻塞式的,使用少量的线程来做更多的事。
ZuulIO反应式2024-11-30

Spring注解Autowired的底层实现原理详解

从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。本文就来聊聊Autowired的底层实现原理
2022-11-13

详解SpringMVC底层原理

笔者的专业是软件技术,主修Java,记得刚开始写Web应用的时候,都是直接写Servlet,有多少个请求服务就写多少个Servlet,于是一个系统中出现了一堆的Servlet,记得那会JSP也很流行,后来又经历了Struts1、Struts
SpringMVC软件2024-11-30

PHP数组在底层的实现原理详解

PHP数组由哈希表和顺序元素数组实现。哈希表将键映射到元素数组索引,元素数组顺序存储元素。数组元素通过键哈希为哈希表索引,再利用索引获取元素数组中元素位置,快速高效访问。插入和删除元素时,哈希表会调整索引,维持数组结构。数组性能受哈希函数、哈希表大小和访问模式影响。优化策略包括选择合适哈希函数、调整哈希表大小、使用有序数组和避免哈希表重新哈希。
PHP数组在底层的实现原理详解
2024-04-02

hashmap底层实现原理

hashmap底层实现原理是:HashMap是基于哈希表的Map接口的非同步实现。HashMap是一个存储key-value键值对的集合,每一个键值对也叫做entry,这些entry分散存储在一个数组中,这个数组也是HashMap的主干,这个数组每个元素的初始值都是null。HashMa是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一。
hashmap底层实现原理
2023-10-29

SpringBoot底层注解详解

这篇文章主要介绍了SpringBoot底层注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2023-05-20

数据结构之HashMap底层实现原理详解

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型的数据结构,同时也是我们需要掌握的数据结构,更重要的是进大厂面试必问之一;

详解Golang中NewTimer计时器的底层实现原理

本文将主要介绍一下Go语言中的NewTimer,首先展示基于NewTimer创建的定时器来实现超时控制。接着通过一系列问题的跟进,展示了NewTimer的底层实现原理,需要的可以参考一下
2023-05-18

数据结构之LinkedList底层实现和原理详解

日常开发中,集合是我们经常用到的一种数据结构,当然,集合也并不是一种,也没有所谓的最好的集合,只有最适合的;今天我们就来聊聊LinkedList底层实现和原理。

HashMap的底层实现原理

这篇文章主要介绍“HashMap的底层实现原理”,在日常操作中,相信很多人在HashMap的底层实现原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HashMap的底层实现原理”的疑惑有所帮助!接下来,请跟
2023-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录