用大白话聊聊SpringBoot的自动配置原理(面试题详解)

news2024/7/4 5:15:31

首先,SpringBoot的自动配置不等于自动装配!

自动配置是Auto-Configuration,针对的是SpringBoot中的配置类,
而自动装配是Autowire,针对的是Spring中的依赖注入。


进入主题:

自动配置简单来说就是自动去把第三方组件的Bean装载到IOC容器中,不需要开发人员再去写Bean相关的配置。在SpringBoot应用里只需要在启动类上加@SpringBootApplication注解就可以实现自动装配。
@SpringBootApplication注解是一个复合注解,真正去实现自动配置的注解是它里面的@EnableAutoConfiguration这样一个注解。自动配置的实现主要依靠三个核心的关键技术:

①、第一个,引入Starter
在这里插入图片描述
启动依赖组件的时候,这个组件里必须要包含一个@Configuration配置类,而在这个配置类里面我们需要通过@Bean这个注解去声明需要装配到IOC容器里面的Bean对象。

②、第二个,这个配置类是放在第三方的jar包里面,然后通过SpringBoot中约定优于配置的这样一个理念,去把这个配置类的全路径放在classpath:/META-INF/spring.factories文件里面,这样SpringBoot就可以知道第三方jar包里面这个配置类的位置,这个步骤主要是用到了Spring里面的SpringFactoriesLoader来完成的

约定优于配置理念:
维基百科解释如下:
约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做出决定的数量,活得简单的好处,而又不失灵活性。
本质上是说,开发人员仅需要规定应用中不符约定的部分,例如,如果模型中有个名为 Sale 的类,那么数据库中对应的表就会默认命名为 sales。只有偏离这一约定时,例如将该表命名为“products_sold”,才需写有关这个名字的配置。
如果您所用工具的约定与你的期望相符,便可省去配置;反之,你可以配置来达到你所期待的方式。
如何理解 Spring Boot 中的约定优于配置

③、第三个,SpringBoot拿到所有第三方jar包里面声明的配置类以后,再通过Spring提供的ImportSelector这样一个接口来实现对这些配置类的动态加载,从而去完成自动配置这样一个动作。

在我看来,Springboot是约定优于配置这一理念下的一个产物,所以在很多地方都能看到这一类的思想,它的出现让开发人员可以更加聚焦(集中注意)在业务代码的编写上,而不需要去关心和业务无关的配置。

拓展:其实自动配置的思想在SpringFramework3.x版本里面的@Enable注解就已经有了实现的一个雏形,@Enable注解是一个模块驱动的意思,也就是说我们只需要增加@Enable注解就能自动打开某个功能,而不需要针对这个功能去做Bean的配置,@Enable注解的底层也是去帮我们自动去完成这样一个模块相关Bean的注入的,然后基于这一理念有了后来的SpringBoot自动配置。

以上就是我对于SpringBoot自动配置的一个理解。

在这里插入图片描述


关于SpringBoot自动配置的更深入理解可以参考这个视频:
B站目前讲的最透彻的SpringBoot自动配置,大厂面试必备知识点#安员外很有码
可能面试大厂需要讲得这么详细,多数面试就按照上面简短回答一下理解就好。


顺带再贴一下ChatGPT给出的java config常见注解作为拓展学习~

在使用 Java Config 配置 Spring 应用程序时,常见的注解包括:

  • @Configuration:用于标记一个类为配置类,相当于 XML 配置文件中的 标签。

  • @Bean:用于标记一个方法为 Spring Bean 的定义,相当于 XML 配置文件中的 标签。

  • @ComponentScan:用于指定要扫描的包,并自动将标记为 @Component、@Service、@Repository等注解的类注册为 Spring Bean。

  • @Autowired:用于自动注入一个依赖对象,相当于 XML 配置文件中的 标签。

  • @Qualifier:用于指定注入的 Bean 的名称,配合@Autowired一起使用。

  • @Value:用于从配置文件中读取属性值,并注入到一个变量中。

  • @Profile:用于指定不同的环境或配置激活时才注册相应的 Bean。

  • @Scope:用于指定 Bean 的作用域,包括 singleton(单例)和 prototype(原型)等。

  • @PostConstruct:用于指定初始化方法,在 Bean 创建后执行。

  • @PreDestroy:用于指定销毁方法,在 Bean 销毁前执行。

这些注解是常见的 Java Config 配置中使用的注解,通过它们可以方便地完成 Spring Bean 的定义、依赖注入和各种配置。这种基于注解的配置方式相比传统的 XML 配置更加简洁和可读性更高。

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

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

相关文章

告诉你一个真实的短视频自媒体收入

我是卢松松,点点上面的头像,欢迎关注我哦! 10个月前我分享了《这一年半我在短视频的收入》都是真实的,最近我看到有人在分享卢松松做短视频的收入,玩视频又被赋予了很多内容,我这说明下也是一些小感悟分享…

故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断

文章目录 效果一览文章概述模型描述源码设计参考资料效果一览 文章概述 故障诊断模型 | Maltab实现CNN卷积神经网络故障诊断 模型描述 卷积神经网络(convolutional neural network)是具有局部连接、权重共享等特性的深层前馈神经网络,最早主要是用来处理图像信息。 相比于全…

电路的电线的拼接

不积跬步无以至千里,今天小编也是复习今天学习的内容,废话不多说,看博客吧!!! 目录 准备条件 操作 成品 准备条件 操作 将定制的套管插入导线当中,24V或者0V是尖端的端子,后面根…

【排序算法】 归并排序详解!深入理解!思想+实现!

🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️归并排序的思想☁️基本思想☁️归并的思想实现☁️分治法 &#x1f3…

H5游戏源码分享-跳得更高

H5游戏源码分享-跳得更高 控制跳动踩到云朵上 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta http-equiv"Content-Type" content"text/html;"&g…

利用ChatGPT进行股票走势分析

文章目录 1. 股票分析2. 技巧分析3. 分析技巧21. 股票分析 这张图片显示了一个股票交易软件的界面。以下是根据图片内容的一些解读: 股票代码: 图片右上角显示的代码是“600517”,这是股票的代码。 图形解读: 该图展示了股票的日K线图。其中,蜡烛图表示每日的开盘、收盘、最…

Rest风格基本语法与实战

1&#xff0c;前置知识点 1.1 GetMapping&#xff0c;PostMapping&#xff0c;PutMapping&#xff0c;DeleteMapping 平时我们都是使用RequestMapping&#xff0c;然后通过它的method属性来指定请求的方式&#xff0c;这样是有些麻烦的&#xff0c;然后这四个标签就是来简化这…

Day 16 python学习笔记

静态方法 静态方法&#xff0c;只需要在方法前添加 staticmethod&#xff0c; 方法就可以不写形参self&#xff0c;可以通过实例对象.方法名调用&#xff0c;也可以通过类名.方法名调用 例&#xff1a; class Test:staticmethoddef test1():print("你好")def nums(se…

异步 AIMD 收敛

给出的一直都是同步 AIMD 收敛&#xff0c;所以简单&#xff0c;但不至于 bbr 单流情形退化成简陋。 给出一个异步 AIMD 收敛过程是必要的&#xff0c;可见&#xff0c;它同样是简洁优美的&#xff1a; 虽然我没有标注太多&#xff0c;它始终没有成为一团乱麻。 和同步 AIM…

Linux tar打包命令

Linux 系统中&#xff0c;最常用的归档&#xff08;打包&#xff09;命令就是 tar&#xff0c;该命令可以将许多文件一起保存到一个单独的磁带或磁盘中进行归档。不仅如此&#xff0c;该命令还可以从归档文件中还原所需文件&#xff0c;也就是打包的反过程&#xff0c;称为解打…

随机链表的复制(Java详解)

一、题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的…

英语——分享篇——常用人物身份

常用人物身份 家庭成员类 father 父亲 mother 母亲 grandmother&#xff08;外&#xff09;祖母 grandfather&#xff08;外&#xff09;祖父 son 儿子 daughter 女儿 uncle 叔叔&#xff0c;舅舅 aunt 婶母&#xff0c;舅母 brother 兄弟 sister 姐妹 nephew 侄子 niece…

Centos7下生成https自签名证书

1、安装openssl yum install openssl2、生成带密码的私有秘钥文件 openssl genrsa -des3 -out server.key 2048使用带密码的私有秘钥文件时需要输入密码&#xff0c;这里直接输入&#xff1a;123456 3、生成不带密码的私有秘钥文件 openssl rsa -in server.key -out serve…

考虑时空相关性的风电功率预测误差MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 风电功率预测置信区间误差分析拟合 1.风电功率预测误差--时空相关性 展示第一一个时间段的风电功率预测与实际风电功率值的比较。填充区域表示预测的不确定性&#xff0c;显示了95%置信区间内预测可能的范围…

vulnhub momentum 靶机复盘

环境配置 到学校了 原来的桥接配置要改 这里记录几个点备忘 1.virtualbox 桥接 未指定 重新安装驱动VBoxNetLwf.inf 2.配置完靶机启动失败 手动安装VBoxNetLwf.inf 不要用virtualbox自带的netlwfinstall 3.配置完nmap扫不到 rw init/bin/bash 进去看看网卡配置 信息收集…

【Java系列】HashMap

HashMap 介绍HashMap 类提供了很多有用的方法添加键值对(key-value)创建一个字符串&#xff08;String&#xff09;类型的 key 和字符&#xff08;String&#xff09;类型的 value&#xff1a;访问元素删除元素删除所有键值对(key-value)可以使用 clear 方法&#xff1a;计算大…

基于SSM的养老院管理系统

基于SSM的养老院管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVUE工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 摘要 养老院管理系统是一个基于SSM&#xff08;Spring、Spring MVC、MyBatis&…

基于SSM的航空订票系统

基于SSM的航空订票系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 管理员界面 摘要 基于SSM的航空订票系统是一款面向旅客、航空公司和旅…

FreeRTOS_信号量之二值信号量

目录 1. 信号量简介 2. 二值信号量 2.1 二值信号量简介 2.1.1 二值信号量无效 2.1.2 中断释放信号量 2.1.3 任务获取信号量成功 2.1.4 任务再次进入阻塞态 2.2 创建二值信号量 2.2.1 vSemaphoreCreateBinary() 2.2.2 xSemaphoreCreateBinary() 2.2.3 xSemaphoreCrea…

初学编程需要什么基础,零基础学编程系统化编程课程之编程工具箱文件名称操作构件属性

初学编程需要什么基础&#xff0c;零基础学编程系统化编程课程之编程工具箱文件名称操作构件属性 上图为 该编程工具构件的基本属性和方法 编程系统化课程总目录及明细&#xff0c;零基础学中文编程视频教程&#xff0c;点击进入了解详情。 https://blog.csdn.net/qq_29129627/…