SpringBoot自动配置原理(简单总结)

SpringBoot2和SpringBoot3的自动配置原理大致相同,只是存放我们导入的starter中的配置类的信息的文件由对应starter的jar包下的META-INF/spring.factories文件变成了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件。

此外,本文只是简单概述了一下SpringBoot自动配置的原理,不是很详细,做一个大致的了解,如果想要了解的更深入,可以看一下我曾经在网上看到的这几篇文章。

springboot2的自动配置原理

springboot3的自动配置原理

启动类文件中的main方法

要谈 SpringBoot 的自动装配,肯定离不开下面这段代码。

先来看看这段代码:  

ConfigurableApplicationContext run = SpringApplication.run(AppRunApplication.class, args);

这段代码的作用是启动 SpringBoot 应用程序,并返回一个 ConfigurableApplicationContext 对象的实例。

SpringApplication.run() 方法返回的是 ConfigurableApplicationContext 类型的对象,表示 Spring 应用程序的上下文。这个上下文保存了Spring 容器中所有 bean 的引用,对于应用程序中的其他组件来说,这个上下文就是一个全局共享的容器。

SpringApplication.run(AppRunApplication.class, args) 语句的意义是基于 AppRunApplication 这个类启动 SpringBoot 应用程序,并将命令行参数传递给应用程序。运行这个语句后,Spring会自动进行应用程序的初始化工作,包括创建ApplicationContext、注册所有的bean定义、启动嵌入式Web容器、加载应用程序的配置文件等。

此外,通过这个方法还可以获取到 ConfigurableApplicationContext 的实例,使用这个对象可以进一步控制应用程序的运行,如手动关闭应用程序、获取应用程序的环境变量、添加自定义的bean等。

这个 run 其实 可以简单地理解为 Spring 的 IOC 容器,SpringBoot 启动时会自动帮我们配置程序运行需要的使用的 Bean 对象放到 IOC 容器中,我们在其他类需要使用时只需要使用 @Autowire 或者 @Resource 注解进行依赖注入即可。

举例:

我们在启动类中,创建了一个 Test 类,然后声明了一个 Bean 方法,它的作用就是返回一个 Test 类,然后我们进行断点调试。

我们通过 run 拿到了 Test 的 Bean 实例

如果我们试图获取一个没有使用 Bean 方法注册的类,就会抛出异常。

自动配置

每次启动一个springboot程序都要通过主配置类来启动,这个主配置类上放了一个注解@SpringBootApplication,此注解意为:标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用,是我们研究的重点!

点进@SpringBootApplication,发现是一个组合注解

@Target:用于指定注解的作用目标

@Retention:注解的生命周期

@Document:是否生成javaDoc文档

@Inherited:注解是否可以被继承

@ComponentScan:这个注解用于指定 Spring 扫描组件的基础包。Spring 会扫描指定包及其子包下的所有类,查找带有 @Component 及其派生注解(如 @Service@Repository@Controller)的类,并将其注册为 Spring 的 bean。

@SpringBootConfiguration:这个注解是 @Configuration 注解的派生注解,用于标识一个类是 Spring Boot 的配置类。Spring Boot 会自动扫描这些配置类并加载其中的配置。

@EnableAutoConfiguration:这个注解用于启用 Spring Boot 的自动配置机制。它会根据项目的依赖和配置,自动配置 Spring 应用程序的 bean。

其中最核心的就是 @EnableAutoConfiguration 这个注解

@EnableAutoConfiguration

顾名思义:开启自动配置功能,点进去看一下

其中重点是@AutoConfigurationPackage 和 @Import({AutoConfigurationImportSelector.class}) 

@AutoConfigurationPackage

自动导入配置包

点进去查看源码

@Import 为spring的注解,导入一个配置文件,在springboot中给容器导入一个组件,而导入的组件由 AutoConfigurationPackages.class的内部类Registrar.class 执行逻辑来决定是如何导入的。

点进去查看源码

 打断点进行调试,可以看到metadata显示为当前启动类所在的包名。

注:Registrar实现了ImportBeanDefinitionRegistrar类,就可以被注解@Import导入到spring容器里。

结论

@AutoConfigurationPackage 就是将主配置类(@SpringBootApplication 标注的类)所在的包下面所有的组件都扫描注冊到 spring 容器中。

@Import({AutoConfigurationImportSelector.class})

AutoConfigurationImportSelector:开启自动配置类导包的选择器,即是有选择性的导入META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中符合条件的配置类(@ConditionalOnxxx注解),@EnableAutoConfiguration会自动的把上面文件里面写的所有自动配置类都导入进来。

结论

@Import(AutoConfigurationImportSelector.class):加载所有通过starter导入进来的自动配置类到spring容器中。

总结:

springboot的自动配置主要集中在@SpringBootApplication中的@EnableAutoConfiguration注解中,而@EnableAutoConfiguration注解又使用@AutoConfigurationPackage来导入启动类包下的配置类到spring容器,使用 @Import({AutoConfigurationImportSelector.class}) 导入*imports文件下符合@ConditionOnXXX的配置类到spring容器。

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

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

相关文章

数据分析之一些Excel函数

数据分析之Excel的使用 SUM()求和SUMIF()单条件求和SUMIFS()多条件求和日期函数YEAR()提取年份MONTH()提取月份DAY()提取日DATE()函数 SUBTOTAL()求和IF()函数IF嵌套 VLOOKUP()搜索取值MATCH()返回行值或列值INDEX()定位取值 SUM()求和 SUM(number1,[number2],…) 对选中的区域…

websocket逆向案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、案例地址二、分析流程三、逆向参数四、webSocket 交互位置总结 前言 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供…

Java项目:基于springboot实现的OA协同办公系统(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue实现的付费自习室系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

以客户为中心、以市场为导向的创新研发能力:塑造企业核心竞争力的关键

在当今竞争激烈的市场环境中,企业的生存与发展往往取决于其核心竞争力。其中,以客户为中心、以市场为导向的创新研发能力,成为了塑造企业核心竞争力的关键要素。本文将探讨这一观点,并结合实际案例进行分析。 一、以客户为中心&am…

TCP收发——计算机网络——day02

今天主要讲了TCP的收发 TCP发端步骤 ①socket ②connect ③send ④closeTCP收端步骤 ①socket ②bind ③listen ④accept ⑤recv ⑥clise其函数主要有 connect int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:发送链接请求参数:sockfd:套接…

Linux:锁和线程同步的相关概念以及生产者消费者模型

文章目录 加锁的基本原则死锁死锁的概念死锁的条件 线程同步生产者消费者模型模型的理解 理解cp问题条件变量 本篇总结的是关于Linux中锁的相关概念以及生产者消费者模型 加锁的基本原则 加锁的基本原则:谁加锁谁解锁,不要把加锁和解锁这样的操作放在两…

淘宝基于Nginx二次开发的Tengine服务器

最近在群里看到这样一张阿里云网关报错的截图,我保存下来看了下 看到下面有 Tengine提供技术支持,这个Tengine是什么东西呢?我搜索了下似乎是淘宝在nginx的基础上自己改的Web服务器 Tengine还支持OpenResty框架,该框架是基于Ngin…

ios xcode 15 PrivacyInfo.xcprivacy 隐私清单 查询应用使用的隐私api

1.需要升级mac os系统到13 兼容 xcode 15.1 2.升级mac os系统到14 兼容 xcode 15.3 3.选择 New File 4.直接搜索 privacy 能看到有个App Privacy 5.右击Add Row 7.直接选 Label Types 8.选中继续添加就能添加你的隐私清单了 苹果官网文档

UE4案例记录

UE4案例记录(制作3D角色显示在UI中) 制作3D角色显示在UI中 转载自youtube视频 https://www.youtube.com/channel/UCC8f6SxKJElVvaRb7nF4Axg 新建项目 创建一个Actor 场景组件->摄像机组件->场景捕获组件2D,之后添加一个骨骼网格体…

打破信息获取的界限:灵雀云推出自主研发智能文档机器人KnowledGenie

自LLM(Large Language Model)技术的迅速崭露头角以来,整个AI领域已经发生了翻天覆地的变化。LLM技术的不断进步,特别是以ChatGPT为代表的技术,为人工智能领域带来了前所未有的发展机遇。这种技术的出现,使得…

全国车辆识别代码信息API查询接口-VIN深度解析

我们先来介绍下什么是vin码,以及vin码的构成结构解析,汽车VIN码,也叫车辆识别号码,通俗可以理解为汽车的身份证号码。 VIN码一共分四大部分: 1~3位,是世界制造厂识别代号(WMI)&…

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是,如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同,因特网的运输层为应用层提供了两种不同的运输协议,即面向连接的TCP和无连接的UDP 5.2…

c 语言中指针注意事项

看看下面两个 #include<iostream> using namespace std;int main() {int a 10;char p[6];*((int *)p) *(& a); // 正确写法*p *(&a); // 错误写法cout << *(int*)p; } 把原因写在评论区

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的手写数字和符号识别(深度学习训练+UI界面+训练数据集)

摘要&#xff1a;开发手写数字和符号识别对于智能交互系统具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个手写数字和符号识别&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模…

金融需要多样性,量化需要C++!通过本文,你可以知道:1、为什么是C++

通过本文&#xff0c;你可以知道&#xff1a; 1、为什么是C 2、Python的用武之地 3、量化C岗位薪酬水平 C VS Python 量化交易系统开发语言主要用C&#xff0c;也有人用Python。 但是从经验看&#xff0c;用C开发的量化交易系统能够让在系统中程序运行的速度更快。 量化交易…

qml中toolbox控件、ComboBox控件、PlainText实现及美化

一. 内容简介 qml中toolbox控件、ComboBox控件、PlainText实现及美化 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本…

其实很多人不了解SQL Developer

今天主要讲怎么用工具和堡垒机配合连接数据库。 不少使用Oracle的开发和运维都会使用PL/SQL Developer 这个是个不错的软件。只不过从知识产权角度来说他是要收费的。所以理论上要去购买。 其实Oracle官方自己也有自己的工具叫SQL Developer。两个名字差不多。他长这个样子。 …

计算机如何处理异常

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;这篇文章主要计算机究竟是如何处理异常的&#xff0c;异常可以分成中断、陷阱、故障、中止这样四种情况。这四种异常&#xff0c;分别对应着 I/O 设备的输入、程序主动触发的状态切换、异常情况下的程序出错以及出错之后无可…

【C语言】三种方式实现字符串(char*)/字符数组(char[ ])输入输出

前言 做题时经常需要用到字符串&#xff0c;写篇笔记加强记忆&#xff0c;本文用 4个例子实现字符串的输入输出操作。 scanf(); 从键盘输入数据时&#xff0c;遇到 “空格”、“回车” 都会终止。若要接受空格&#xff0c;使用 gets(); 代替 scanf(); 多个 scanf(); 同时出现…

TYPE C模拟耳机POP音产生缘由

关于耳机插拔的POP音问题&#xff0c;小白在之前的文章中讲述过关于3.5mm耳机的POP音产生原因。其实这类插拔问题的POP音不仅仅存在于3.5mm耳机&#xff0c;就连现在主流的Type C模拟耳机的插拔也存在此问题&#xff0c;今天小白就来讲一讲这类耳机产生POP音的缘由。 耳机左右…