面试篇-SpringBoot自动配置原理

在Spring Boot中,自动装配是一种强大的功能,它允许开发者快速、简单地配置和管理应用程序的组件。以下是对Spring Boot自动装配原理的详细解释:

  1. Spring BootApplication注解源码:

    • @SpringBootApplication注解是一个复合注解,它包含了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan扫描三个注解。

    • @SpringBootConfiguration:表示当前类是一个配置类,通过@Configuration与@Bean结合,可以将Bean注册到IoC容器。

    • @EnableAutoConfiguration:一旦加上此注解,那么将会开启自动装配功能。Spring会试图在项目的classpath下找到所有配置的Bean然后进行装配。

    • @ComponentScan:用于指定Spring容器扫描的包路径,让Spring容器自动识别并加载所需的组件。

  2. 自动装配的核心:

    • 一切的开始都是从SpringApplication.run()方法开始的。这是自动装箱的核心,即这个run方法的执行过程。创建Bean之前的准备工作是必要的。

    • SpringApplication.run()方法需要传入两个参数,第一个参数就是启动类本身,用于在之后解析启动类(解析标记的注解、启动类作为一个配置类,也需要解析),后面那个args是传入的虚拟机参数。

  3. 解析启动类:

    • 在SpringApplication.run()方法中,首先解析启动类。解析过程中会解析启动类上的注解,如@SpringBootApplication等。解析后的结果会被用于创建IoC容器。

  4. 自动装配的过程:

    • 当Spring Boot应用程序启动时,IoC容器会根据@EnableAutoConfiguration注解自动配置Bean。容器会扫描classpath下的所有Bean,并根据条件判断是否需要进行自动装配。

    • 自动装配时,容器会根据Bean之间的依赖关系,自动将需要的Bean注入到相应的Bean中。这大大简化了配置工作,并提高了开发效率。

  5. 循环依赖问题:

    • 在自动装配过程中,可能会出现循环依赖的问题。例如,Bean A依赖于Bean B,同时Bean B也依赖于Bean A。为了避免这种情况,开发者需要合理设计组件之间的依赖关系,或者使用其他方式解决循环依赖问题。

  6. 自定义自动装配:

    • 在某些情况下,开发者可能需要自定义自动装配的规则。这时可以使用@Autowired注解进行自定义装配规则的配置。例如,可以指定装配的Bean类型、名称等。

  7. 总结:

    Spring Boot的自动装配功能大大简化了配置工作,提高了开发效率。开发者需要了解其原理和注意事项,以便更好地利用这一功能。同时,也需要合理设计组件之间的依赖关系,避免出现循环依赖等问题。

面试官问: 说说springboot自动装配的原理?

我需要说: 

主配置类启动,通过@SringBootApplication 中的@EnableAutoConfguration 加载所需的所 有自动配置类,然后自动配置类生效并给容器添加各种组件。那么@EnableAutoConfguration 其实是通过它里面的@AutoConfigurationPackage 注解,将主配置类的所在包皮下面所有子包 里面的所有组件扫描加载到 Spring 容器中; 还通过@EnableAutoConfguration面的 AutoConfigurationImportSelector 选择器中的 SringFactoriesLoader.loadFactoryNames()方法,获取类路径下的 META-INF/spring.factories 中的 资源并经过一些列判断之后作为自动配置类生效到容器中,自动配置类生效后帮我们进行自 动配置工作,就会给容器中添加各种组件:这些组件的属性是从对应的 Properties 类中获取 的,这些 Properties 类里面的属性又是通过@ConfigurationProperties 和配置文件绑定的:所以 我们能配置的属性也都是来源于这个功能的 Properties 类。SpringBoot 在自动配置很多组件 的时候,先判断容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置 的,如果没有,才自动配置;如果有些组件可以有多个就将用户配置和默认配置的组合起来

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode—课程表 拓扑排序

1 题目描述 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 …

旋转编码器SIQ-02FVS3驱动(AuroraFOC)

一. 简介 本次将基于AuroraFOC开发板,来教大家如何将旋转编码器按键优雅地使用起来,为大家开发多功能按键提供一种思路。 开发环境 STM32CubeMX HAL库Clion 作者: FPGA之旅(ValentineHP) 二. 原理(图)介绍 旋转编码器按键原理图如下,它…

《动手学深度学习(PyTorch版)》笔记3.1

Chapter3 Linear Neural Networks 3.1 Linear Regression 3.1.1 Basic Concepts 我们通常使用 n n n来表示数据集中的样本数。对索引为 i i i的样本,其输入表示为 x ( i ) [ x 1 ( i ) , x 2 ( i ) , . . . , x n ( i ) ] ⊤ \mathbf{x}^{(i)} [x_1^{(i)}, x_2…

【cdh】hive执行SQL提示缺少3.0.0-cdh6.3.2-mr-framework.tar.gz文件

问题:执行SQL报错提示缺少文件 异常信息如下 在hdfs上查看的时候连文件夹都没有,所以这个异常会抛出,但是我是基于CDH搭建的,可以直接基于下面操作 执行完成之后查看HDFS文件 重新执行SQL发现可以正常执行了

ad18学习笔记十六:v割

所谓“V割”是印刷电路板(PCB)厂商依据客户的图纸要求,事先在PCB的特定位置用转盘刀具切割好的一条条分割线,其目的是为了方便后续SMT电路板组装完成后的分板之用,因为其切割后的外型看起来就像个英文的“V”字型&…

【机器学习】强化学习(六)-DQN(Deep Q-Learning)训练月球着陆器示例

概述 Deep Q-Learning(深度 Q 学习)是一种强化学习算法,用于解决决策问题,其中代理(agent)通过学习在不同环境中采取行动来最大化累积奖励。Lunar Lander 是一个经典的强化学习问题,其中代理的任…

教学质量常态监控与评价平台

教学质量常态监控与评价平台,以提高教学质量为目标导向,利用Al、大数据等新型技术手段作为技术支撑,服务于教学质量科、督导、教师、学生等角色,基于教学过程数据,关注教师的教学内涵,覆盖了对教师、课堂、…

【刷题】 leetcode 面试题 08.05.递归乘法

递归乘法 1 题目描述2 思路一(返璞归真版)3 思路二(二进制乘法器版)4 思路三(变态版)Thanks♪(・ω・)ノ谢谢阅读下一篇文章见!!! 1 题目…

数据结构.双链表循环链表

一、1.双链表的初始化 void InitLNode(LinkList& L)//双链表的初始化 {L (LNode*)malloc(sizeof(LNode));L->prior NULL;L->next NULL;} 2.双链表的插入 void DInsert(LNode* p,LNode*s)//在p结点后面插入s结点 {s->next p->next;s->next->prior s;…

使用dockers-compose搭建开源监控和可视化工具

简介 Prometheus 和 Grafana 是两个常用的开源监控和可视化工具。 Prometheus 是一个用于存储和查询时间序列数据的系统。它提供了用于监控和报警的数据收集、存储、查询和图形化展示能力。Prometheus 使用拉模型(pull model),通过 HTTP 协议…

微信小程序(十九)组件通信(子传父)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.定义触发事件向父组件传输数据 2.父组件绑定绑定触发事件并获取数据 源码&#xff1a; myNav.wxml <view class"navigationBar custom-class" style"padding-top: {{test}}px;">&l…

【GitHub项目推荐--不错的 React 开源项目】【转载】

用 React Flow 连接你的想法 用 React Flow 连接你的想法&#xff0c;这是一个高度可定制的库&#xff0c;基于 React 用于构建基于节点的 交互式 UI、编辑器、流程图和图表。 开源地址&#xff1a;https://github.com/wbkd/react-flow Bulletproof React 一个简单、可扩展且…

什么时跨域问题和如何解决跨域问题

什么是跨域问题&#xff1f;解决跨域的方案都有哪些&#xff1f;日常工作中会使用哪种解决方案&#xff1f; 跨域问题指的是不同站点之间&#xff0c;使用ajax无法互相调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为了保证用户的安全&#xff0c;防…

一道CTF签到题

点击题目的签到&#xff0c;提示&#xff1a; 看来需要修改请求的源地址&#xff1a; 上来我先尝试了我最常用的xff&#xff0c;结果不行&#xff0c;于是尝试了其他的几个常用请求头&#xff1a; 1.host头 如果后端从host取值来判断是否是本地就可以通过此方法进行绕过&…

【语录】岁月

中年 写中年&#xff0c;应该是年少励志三千里 踌躇百步无寸功&#xff0c;转眼高堂已白发 儿女蹒跚学堂中&#xff0c;不如意事常八九&#xff0c;可与人言无二三 可是诸位&#xff0c;不用悲伤&#xff0c;稻盛和夫说&#xff0c; 人生并不是一场物质的盛宴&#xff0c;而是…

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由&#xff08;首页&#xff0c;详情&#xff09;3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参&#xff08;查询参数 $ 动态路由&#xff09;7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由&#xff08;首…

MGRE综合实验

一&#xff1a;实验要求 二&#xff1a;实验过程 1、配置IP [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0/0]q [r1]int s4/0/0 [r1-Serial4/0/0]ip add 15.0.0.1 8 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 192.168.2.1 2…

【高效开发工具系列】Java读取Html

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

STM32 SDIO接口传输中的错误处理和中断优化技巧

在 STM32 的 SDIO 接口传输中&#xff0c;错误处理和中断优化是确保传输稳定和可靠性的重要方面。下面将介绍一些常用的错误处理和中断优化技巧&#xff0c;并给出相应的代码示例。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注我的…

Redis 持久化详解:RDB 与 AOF 的配置、触发机制和实际测试

什么是持久化&#xff1f; 就是 Redis 将内存数据持久化到硬盘&#xff0c;避免从数据库恢复数据。之所以避免从数据库恢复数据是因为后端数据通常有性能瓶颈&#xff0c;大量数据从数据库恢复可能会给数据库造成巨大压力。 Redis 持久化通常有 RDB 和 AOF 两种方式&#xff…