SpringBoot自动装配源码解析

news2025/1/10 21:02:43

Spirngboot为啥会比Spring使用更简单,少了那么多的Xml文件?一切都是基于SpringBoot的自动装配,当然SpringBoot的自动装配也是一个高频的面试题。

1.@SpringApplication注解的源码分析

在分析源码时,都要问一问为什么SpringBoot能基于自动装配?
这是一个SpringBoot的项目
在这里插入图片描述

1.首先来看下SpringBoot的 @SpringBootApplication注解,在@SpringBootApplication注解下有三个注解,分别是 @SpringBootConfiguration@EnableAutoConfiguration
@ComponentScan

在这里插入图片描述

2.查看 @SpringBootConfiguration 底层它其实就是一个 @Configuration注解,学过Spring的都知道 @Configuration 其实就是一个配置类

在这里插入图片描述

3.所以不关注这个注解,咱们直接查看 @EnableAutoConfiguration 这个注解

在这里插入图片描述

4.直接在进入 @AutoConfigurationPackage 注解下查看 发现又有一个 @Import(AutoConfigurationPackages.Registrar.class)

在这里插入图片描述

5.AutoConfigurationPackages 这个类下发现 它调取了getAutoConfigurationEntry()

在这里插入图片描述

6.然后这个 getAutoConfigurationEntry() 又调取了getCandidateConfigurations() 这个方法

在这里插入图片描述

7.在 getCandidateConfigurations() 这个方法下就2行代码,一行调取了loadFactoryNames() ,另外一个断言判空,但是好像看到一个
META-INF/spring.factories.(spring的发可T锐死)

在这里插入图片描述

8.然后咱们看下这个loadFactoryNames()这个方法里做了什么
在这里插入图片描述
在这里插入图片描述

  1. 由上图咱们看到是加载了一个META-INF下的 spring.factories 然后循环遍历取元素
    这里就咱们看下 spring.factories 是个什么东西。

在这里插入图片描述
在这里插入图片描述

10 全局搜索咱们发现spring.factories 文件是 spring-boot-autoconfigure下的一个文件
到这里咱们就发现 spring.factories 文件里的信息,它与 POM.xml文件下的 spring-boot-starter-parent 父依赖下加载的启动类maven坐标的包类似
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.然后回到spring.factories文件,咱们随便点击一个类,会发现底层大量的使用了 @Conditional注解@Conditional注解来判断是否加载了spring-boot-starter-xxx之类的依赖,也就是Starter组件

在这里插入图片描述

到这里基本就明白为啥SpringBoot能够自动装配了,下面总结梳理一下

总结:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中。

在这里插入图片描述

2.SpringApplication.run分析

由于run方法源码过于繁琐,在这里就引用其他大佬的梳理的图作为了解
run() 方法总结为4个步骤:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类

在这里插入图片描述
最后:

关于springboot,谈谈你的理解: springboot 主要分: springboot的自动装配和run()
springboot的自动装配:
SpringBoot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中

run():
①判断当前项目是普通项目还是web项目
②推断并设置main方法的定义类,找到运行的主类
③run方法里面有一些监听器,这些监听器是全局存在的,它的作用是获取上下文处理一些bean,所有的bean无论是加载还是生产初始化多存在。

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

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

相关文章

时间序列论文-聚类和异常检测(一)

这篇文章摘自,知乎:https://www.zhihu.com/question/29507442/answer/1212624591?utm_id0 写的很好,就记录一下。 两篇关于时间序列的论文 原文链接:两篇关于时间序列的论文 这次整理的就是清华大学裴丹教授所著的两篇与时间序…

Qt/C++音视频开发52-采集本地屏幕桌面的终极设计

一、前言 最开始设计的时候,只考虑了一个屏幕的情况,这种当然是最理想的情况,实际上双屏或者多屏的用户也不在少数,比如我这两个屏幕,屏幕1是1080P,屏幕2是2K分辨率,打印两个屏幕的区域是 QRec…

【EI会议征稿】2023年智能科学与计算机工程国际学术会议(ISCE 2023)

2023年智能科学与计算机工程国际学术会议(ISCE 2023) 2023 International Conference on Intelligence Scicence andComputer Engineering 2023年11月3-5日 中国-西双版纳 迄今为止,人工智能研究在一些特殊领域取得了一定的实质性进展。然…

单相并联下垂控原理

Part1 上述有个核心的piont是等效阻抗上的电压一般时很小的,这就导致逆变器输出电压矢量E和负载电压矢量UL之间的夹角很小 》基于上述的结论有助于我们去简化下垂控制的公式!!! Part2 上述得到负载电流,接着乘以负载…

计算机算法分析与设计(1)---求算法时间复杂性(手写例题)

文章目录 一、主定理求解二、递归树求解三、递归树求解含O的递归方程 一、主定理求解 二、递归树求解 三、递归树求解含O的递归方程

后端|一个分布式锁「失效」的案例分析

小猿最近很苦恼:明明加了分布式锁,为什么并发还是会出问题呢? 故事从接到需求开始说起。 接到需求 小猿前一阵接到一个小任务,里面有一个功能对应的场景如下: 封装一个对账户余额进行加减操作的方法;所属服…

shell指令,通过函数实现数组求和,通过函数获取用户uid和gid

一、实现一个对数组求和的函数&#xff0c;数组通过实参传递给函数 num0 read -p "请输入一组数据&#xff1a;" -a arr function add() {for ((i0; i<${#arr[*]}; i))do ((numarr[i]))donereturn $num } add ${arr[*]} echo $? 二、写一个函数&#xff0c;输出…

基于STM32智能环境系统

摘要 本系统采用stm32f407作为主控芯片&#xff0c;实现对环境的监测。并且通过和手机通信&#xff0c;获取当前的天气预报信息&#xff0c;结合当前测得的温湿度&#xff0c;可以为用户提供出行建议。利用stm32自带的RTC可以实现时间及闹钟功能。此外RTC还可以用于电子日历的…

《信息系统项目管理师教程(第4版)》第19章 配置与变更管理 知识点整理 xmind思维导图

已上传xmind思维导图&#xff0c;需要可下载 一、配置管理 基于配置库的变更控制(经常考) 二、变更管理

华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第4期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、数据结构第2天、滑动窗口第3天、贪心算法第4天、二分查找第5天、分治递归第6天、深度优先搜索dfs算法第7天、宽度优选算法&#xff0c;回溯法 六…

Mybatis-Plus 使用教程

01-Mybatis-Plus介绍 1.1 什么是mybatis-plus 官网: 简介 | MyBatis-Plus MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 1.2 官方愿景 1.3 特性 无侵入&…

伪谱法地震波场数值模拟

本文实现内容 各向同性介质波动方程伪谱法波场求解。各项异性介质(VTI、HTI)介质伪谱法波场求解。实现了衰减边界条件、拓展周期边界法。一种波场模拟的数据存储格式.sfd&#xff0c;提供二进制或文本输入输出。对波场模拟得到的存储数据进行.gif绘制、.png绘制、地震剖面绘制…

MyBatis核心配置文件解析: 一步步深入理解mybatis-config.xml

&#x1f600;前言 在进行MyBatis项目开发时&#xff0c;合理和高效的配置是确保项目顺利进行的基础。其中&#xff0c;mybatis-config.xml配置文件扮演着极其重要的角色&#xff0c;它包含了MyBatis运行时的各种必要配置信息&#xff0c;如数据库连接属性、事务管理器配置、别…

vector容器的详解与分析

简介&#xff1a; vector容器在高级语言中运用非常广泛&#xff0c;此容器可看成C语言中的动态数组结构用来存储一系列数据&#xff0c;它不仅支持C语言数组中的所有使用方式&#xff0c;还支持vector在C中还有更高级的使用。在C往后的高级运用时&#xff0c;通常把一些常用的操…

基于Java web的医院分诊管理系统文档

摘要 医院分诊管理系统是适应时代发展的需要&#xff0c;提高管理的效率而开发设计的&#xff0c;有效的减少了患者排队取号的时间&#xff0c;增加了医生的工作效率。通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享&#xff0c;及时为医院领导及各部…

报错处理:Redis无法连接

报错环境&#xff1a; Linux Redis 具体报错&#xff1a; redis.exceptions.ConnectionError: Error 111 connecting to 127.0.0.1:6379. Connection refused. 排错思路&#xff1a; 当尝试连接Redis服务时&#xff0c;如果出现连接拒绝的错误&#xff0c;可能是由于Redis服务…

修正能力是智能的关键之一

智能包括事前预测、事中干预和事后反馈。这些方面相互关联&#xff0c;共同构成了一个完整的智能系统。 事前预测&#xff1a;智能系统可以通过分析数据、模式识别和机器学习等方法&#xff0c;进行事前预测。它可以根据已有的信息和历史数据&#xff0c;推测未来可能发生的情况…

csdn如何删除已发布的博客内容

首先&#xff0c;将鼠标移动到自己的头像&#xff0c;会显示内容管理 点击内容管理进入下方界面&#xff0c;选择文章&#xff0c;在想要删除的文章的后边的浏览旁边有三个点&#xff0c;点击后选择删除&#xff0c;删除后回到主页面刷新页面&#xff0c;会发现已发布的文章已经…

饲料添加剂 微生物 植物乳杆菌 学习记录

声明 本文是学习GB 7300.502-2023 饲料添加剂 第5部分&#xff1a;微生物 植物乳杆菌. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了饲料添加剂植物乳杆菌的技术要求、采样、检验规则、标签、包装、运输、贮存和保质 期&#…

K8S 二进制部署

一、准备规划二、操作系统初始化配置2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap2.4 根据规划设置主机名2.5 在master添加hosts2.6 调整内核参数 三、部署 docker引擎四、部署 etcd 集群4.1 准备签发证书环境4.2 生成Etcd证书4.3 创建用于存放 etcd 配置文件&#xff0c;命令文…