Spring Boot自动配置原理(Spring Boot面试题)

news2025/1/9 14:33:30

目录

1、产生疑惑 

2、源码分析

2.1、pom.xml文件分析

2.2、启动类分析

3、总结


 

1、产生疑惑 

当我们第一次使用Spring Boot练习的时候会觉得Spring Boot这么厉害,不管是依赖还是配置,它都为我们准备好了,我们只需要去编写业务代码就可以了,省去了配置的繁琐。那么Spring Boot之所以能够为我们提供这些操作,它是如何实现的呢?

2、源码分析

2.1、pom.xml文件分析

我们打开创建Spring Boot项目后的pom.xml文件

可以看到这里有一个parent标签,这就父级工程spring-boot-starter-parent,这叫做Spring Boot的起步依赖,那么这个起步依赖有什么东西呢,我们使用ctrl+左键打开看看

可以看到这里面又继承于一个spring-boot-dependencies的依赖,这就是Spring Boot的核心依赖,我们继续打开

可以看到,这里面整合了大量的依赖和插件,以及各个依赖的版本,非常大的文件,整整3200多行,这就是Spring Boot的核心依赖库,之所以我们不用再去手动导依赖的原因,就是Spring Boot已经把大量我们能用到的整合到了这个库中,之所以我们不用再声明依赖的版本是因为,Spring Boot做了统一的版本控制,不同版本的Spring Boot,里面会有不同版本的依赖。这也是Spring Boot特点之一约定大于配置。

Spring Boot还有很多启动依赖,spring-boot-starter只是其中一个

<!--spring-boot启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<!--springboot-web启动包-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springboot-xxx启动包-->

2.2、启动类分析

有了依赖的支持,那么Spring Boot是如何实现自动配置的呢?

这就需要我们去研究一下启动类中@SpringBootAppliation注解

我们ctrl+鼠标左键打开注解的源码

可以看到里面是一个自定义注解的形式

@Target(ElementType.Type)   返回可以应用于注释类型的元素类型的数组

@Retention(RetentionPolicy.RUNTIME)    指示被它注解的注解保留多久

注解说明
SOURCE注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略
CLASS注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期
RUNTIME注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

@Documented   

指示带有类型的注释在默认情况下由javadoc和类似工具记录。该类型应用于注释类型的声明,这些类型的注释影响其客户端对注释元素的使用。

@Inherited 

指示自动继承注释类型。

@SpringBootConfiguration (核心注解)

该注解作用: 

1.标明本类是个配置类
2.扫描添加了@Configuration的配置类。

@EnableAutoConfiguration (最核心的注解) 开启自动配置

我们打开@Import注解里的AutoConfigurationImportSelector类

找到selectImports方法,里面调用了一个getAutoConfigurationEntry方法

我们ctrl+左键找到此方法,找到getCandidateConfigurations方法

在方法中找到loadFactoryNames方法 

经过层层的寻找,终于在最后找到了获取资源的路径,是在META-INF/spring.factories文件中

Spring Boot自动装配的本质就是通过Spring去读取META-INF/spring.factories中保存的配置类文件然后加载bean定义的过程。

在jar包中,我们去寻找一下这个文件

可以看到,里面有非常多的配置,其中红框中的就是常见的ElasticSearch、MongoData、Redis、SpringData。。。

这就是为什么Spring Boot不用再去让我们再去关注配置的原因

那么这么多配置信息,在Spring Boot启动的时候都会为我们配置上吗?那不用的配置也要配置吗?其实这点Sring Boot早就考虑到了,这些配置信息,只有我们添加了相关依赖才会为我们进行配置。

那么Spring Boot是通过什么来实现根据添加的依赖进行加载对应配置信息呢?

我们可以随便找一个第三方配置类进去看一下,这里我选择redis

可以看到,这里有一个注解没有见过,@ConditionalOnClass注解,这个注解的作用就是检查是否导入相关依赖,如果没有导入,则该类各个方法就会报错

3、总结

经过上面的分析,Spring Boot的自动装配原理总结一句话为:

Spring Boot启动的时候加载主配置类,其中@EnableAutoConfiguration注解会通过@Import注解扫描所有jar包类路径下的"META-INF/spring.factories",里面标注了自动配置类,自动配置类会通过
@ConditionalOnClass注解检测是否添加了相关依赖,如果添加了相关依赖会把自动配置类中bean添加到容器中,完成自动配置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65222.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django数字乡村基础治理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

调优四剑客的实战演练,福尔摩斯•K带你轻松优化性能

前言天下武功&#xff0c;唯快不破。在侦探的世界中&#xff0c;破案效率永远是衡量一名侦探能力的不二法门。作为推理界冉冉升起的新星&#xff0c;大侦探福尔摩斯K凭借着冷静的头脑、严谨的思维&#xff0c;为我们展现了一场场华丽而热血的推理盛宴。接下来&#xff0c;我们不…

【运维面试题】访问www.baidu.com背后发生了什么·dns解析过程·ping过程

文章目录 一、访问www.baidu.com背后发生了什么二、dns解析过程答法1(推荐)答法2三、ping过程一、访问www.baidu.com背后发生了什么 1.浏览器解析url是否合法 2.浏览器向DNS服务器请求解析ip地址 3.dns将解析出来的ip地址返回给浏览器 4.三次握手,浏览器与服务器进行tcp连接…

TVM 从入门到精通 | 安装 TVM (Part 2)

By 超神经内容一览&#xff1a;TVM 共有三种安装方法&#xff1a;从源码安装、使用 Docker 镜像安装和 NNPACK Contrib 安装。本文讲解如何通过 Docker 镜像 和 NNPACK Contrib 安装。关键词&#xff1a;TVM Docker 基础教程 欢迎回到 TVM 文档讲解 101&#xff0c;这个系…

【Python+Appium】开展自动化测试(十二)通过坐标定位元素

目录 前言 1&#xff0c;通过绝对坐标定位&#xff08;不推荐&#xff09; 2&#xff0c;通过相对坐标定位&#xff08;推荐&#xff09; 写在最后 前言 在使用appium做app自动化测试的过程中&#xff0c;可能会遇到元素的属性值不是唯一的情况&#xff0c;导致不能通过fin…

Linux上docker部署Mysql备份与恢复

Linux上Mysql备份与恢复 1.完全备份 完整备份是将所选的全部数据都备份起来&#xff0c;将备份文件生成一个镜像&#xff0c;再保存到其他的硬盘分区中。 1.1 完全备份一个或多个完整的库 ps: 博主mysql是用docker部署的&#xff0c;这时候需要进入docker容器进行操作。 d…

太极限了,JDK的这个BUG都能被我踩到!

之前遇到个文件监听变更的问题&#xff0c;刚好这周末有空研究了一番&#xff0c;整理出来分享给大家。 从一次故障说起 我们还是从故障说起&#xff0c;这样更加贴近实际&#xff0c;也能让大家更快速理解背景。 有一个下发配置的服务&#xff0c;这个配置服务的实现有点特…

详解设计模式:访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。据《大话设计模式》中说算是最复杂也是最难以理解的一种模式了。 访问者模式 是一种将数据操作与数据结构分离的设计模式&#xff0c;它可以算是 23 中设计模式中最…

NewStar CTF Week3Misc 4-5Web

目录 <1> Week-3 Misc (1) Whats HTTP (2) qsdzs girlfriend 3 (3) WebShell&#xff01; (4) 混沌的图像 <1> Week-4 Web (1) So Baby RCE(%0A进行rce rev|sort读取flag) (2) UnserializeThree(%0d换行rce) <2> week5-web (1) Give me your photo…

step-by-step 配置 gtest 在 vscode 测试 c/c++(Ubuntu 环境下示范)

1. 去把 gtest 装好 详见&#xff1a;CSND-PangCoder-[Ubuntu]GTest安装和测试-https://blog.csdn.net/qq_36251561/article/details/85319547 2. 在 VS Code 打上这几个插件 印象里打上 C TestMate 下面的就会自动装了…如果没有就手动装一下 3. 编写测试脚本 第一步那…

【Pytorch】第 1 章 :强化学习和 PyTorch 入门

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Java并发常见面试题(三)

并发编程三大特性 原子性 一次操作或者多次操作&#xff0c;要么所有的操作都得到执行并且不受任何因素的干扰而中断&#xff0c;要么都不会执行。 在 Java 中&#xff0c;可以借助synchronized 、各种 Lock 以及各种原子类实现原子性。synchronized 和各种 Lock 可以保证任…

【吴恩达机器学习笔记】十三、异常检测

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

[附源码]计算机毕业设计人事系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Contest2850 - 【在线编程平台】2022年计算机类数据结构作业12.20221201-1206

问题 A: 二叉排序树 - 文本输出 题目描述 给定一个序列&#xff0c;使用该序列生成二叉排序树&#xff08;也叫二叉搜索树&#xff0c;BST&#xff09;&#xff0c;然后以本题规定方法输出该二叉排序树。 例&#xff1a; 给定一个序列&#xff1a;43 25 29 67 17 88 54 47 35…

用R语言制作交互式图表和地图

可以直接从R / RStudio制作在线交互式图表和地图。 去年&#xff0c;我们为一位客户进行了短暂的咨询工作&#xff0c;他正在构建一个主要基于在线交互式图表的分析应用程序。 配置 启动RStudio&#xff0c;创建一个新的RScript&#xff0c;然后将工作目录设置为下载的数据文…

git merge origin master和git merge master的区别(个人理解)

先说结论 git merge origin master 意思是当前的分支,进行合并,合并二个分支分别是远程分支master在本地的副本和本地分支的master git merge master 当前分支于本地所处的master分支进行合并 还有就是 git merge origin master是把origin merge 到 master 上的说法是错误的…

小侃设计模式(十五)-命令模式

1.概述 命令模式&#xff08;Command Pattern&#xff09;是将一个请求封装为一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。它是行为型模式的一种&#xff0c;能够有效降低系统…

【华为上机真题 2022】流水线

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

ES6:ES6 的内置对象扩展

Array 的扩展方法 扩展运算符&#xff08;展开语法&#xff09; 扩展运算符可以将数组或者对象转为用逗号分隔的参数序列。 let ary [1, 2, 3];...ary // 1, 2, 3console.log(...ary); // 1 2 3console.log(1, 2, 3)为什么没有逗号&#xff0c;这个是因为被当做console…