【杂类】Spring 自动装配原理

这张图,​​正是理解现代 Spring Boot 自动配置的钥匙​​。它指出的 AutoConfiguration.imports 文件,是 Spring Boot 2.7 之后的新标准,比老式的 spring.factories 更简洁。咱们就从这个文件开始说。

一、自动配置是啥?为啥需要它?

想象一下,你想用 Spring MVC 写个 Web 项目,传统 Spring 你得自己配 DispatcherServlet、视图解析器、一堆 XML... 麻烦死了。

Spring Boot 说:“别折腾了,​​约定大于配置​​!你只要在 pom.xml 里告诉我你要干啥(比如引入 spring-boot-starter-web),剩下的我来!”

自动配置就是这个“剩下的我来”。它基于你项目里的​​依赖​​(jar 包)、​​配置​​(application.properties)、​​代码​​,自动帮你把 Spring 应用需要的 Bean 都配好。


二、自动配置是怎么动起来的?(工作流程)

整个过程就像工厂的自动化流水线:

​第 1 步:启动信号 - @SpringBootApplication
你的主类上的这个注解是个​​复合注解​​,它封装了三个核心功能:

  • @SpringBootConfiguration: 标志这是配置类。
  • @ComponentScan: 扫描你写的 @Component, @Service 等。
  • @EnableAutoConfiguration​: 这就是开启自动配置的​​总开关​​!最重要!

​第 2 步:大脑与清单 - @EnableAutoConfigurationAutoConfigurationImportSelector
@EnableAutoConfiguration 注解导入了 AutoConfigurationImportSelector 这个类。它是​​大脑​​,负责干重活。

大脑需要一份​​装配清单​​,才知道要装配什么。它就会去你项目的类路径下找这个清单文件:

  1. ​老清单​​ (META-INF/spring.factories):Spring Boot 2.6 及以前用的,写法啰嗦。
  2. ​新清单​​ (META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports):​​就是你图片里创建的那个文件!​​ Spring Boot 2.7+ 推荐使用,一行一个类名,清爽多了。

​大脑的工作就是读取这份清单上的所有自动配置类。​

​第 3 步:智能筛选 - 条件注解 (@ConditionalOn...)​
清单上列了上百个自动配置类(比如数据源的、Web 的、安全框架的),难道全给你加载?那不乱套了?

当然不是!每个自动配置类上都有一堆 ​@ConditionalOn...​ ​​条件注解​​,这就是流水线的​​智能检测传感器​​。

  • @ConditionalOnClass(DataSource.class)​:传感器:“检测到类路径下有 DataSource 这个类吗?(即你引入了 JDBC 依赖)有?那这个数据源配置类可以生效。”
  • @ConditionalOnMissingBean​:传感器:“检测一下 Spring 容器里,用户自己配了 DataSource 这个 Bean 吗?没配?好,那我来自动配一个。用户配了?牛逼,用用户的。” ​​这个注解是实现“默认配置”和“用户覆盖”的关键!​
  • @ConditionalOnProperty:传感器:“检测配置文件里,有 spring.datasource.url 这个属性吗?有?好,配置生效。”

只有通过了所有传感器检测的配置类,才会被真正加载。

​第 4 步:执行装配 - 配置类里的 @Bean
一个自动配置类本身就是一个 @Configuration,它内部通过 @Bean 方法,向容器中提供配置好的 Bean。

@Configuration // 这是一个配置类
@ConditionalOnClass(DataSource.class) // 条件:有DataSource类才生效
public class DataSourceAutoConfiguration { // 数据源自动配置类@Bean@ConditionalOnMissingBean // 核心:用户没配,我才配!public DataSource dataSource(DataSourceProperties properties) { // 读取配置属性// 根据properties里的url, username, password等,创建一个DataSource实例return properties.initializeDataSourceBuilder().build();}
}

三、你图片的操作:自定义自动配置

你图片里在 resources 目录下创建 AutoConfiguration.imports 文件的操作,​​意味着你正在参与甚至主导这个自动配置过程!​

​你在做什么?​
你是在给你自己的项目(或者你开发的某个 Jar 包)​​编写一份属于自己的“自动配置清单”​​。

​为什么要这么做?​

  1. ​深度定制​​:你想对某个功能做非常复杂的配置,但又不想把一大堆 @Bean 写在主应用里,搞得又乱又长。你就可以把这些配置封装到一个独立的 MyXxxAutoConfiguration 类中,然后在这个 imports 文件里写上它。项目一启动,它就会自动生效。
  2. ​开发自己的 Starter​​:这是终极目标!如果你在公司封装了一套通用组件(比如监控、日志、安全校验),你希望其他项目只要引入你的依赖,就自动配好一切。那你就是在做一个 ​​“自定义 Starter”​​。这个 AutoConfiguration.imports 文件就是你 Starter 的“核心清单”,告诉 Spring Boot:“我这个 Jar 包里也有自动配置,启动时别忘了!”

总结与类比

我们来打个比方,帮你彻底理解:

  • ​Spring Boot 应用​​ -> 一家​​全自动工厂​
  • @SpringBootApplication​ -> 工厂的​​总电源开关​
  • AutoConfigurationImportSelector​ -> 工厂的​​中央控制系统(大脑)​
  • AutoConfiguration.imports 文件​​ -> 控制系统的​​供应商清单​​(你图片里正在创建的就是这个!)
  • DataSourceAutoConfiguration​ -> ​​“水源供应商”​
  • @ConditionalOnClass(DataSource.class)​ -> 供应商的合同条款:“如果工厂需要用水,我就开工”
  • @ConditionalOnMissingBean​ -> 条款细则:“如果工厂没有自己的水井,我才提供自来水”
  • ​最终提供的 DataSource Bean​​ -> 供应商送来的​​“水”​

工厂(你的应用)一通电启动,大脑(控制系统)就照着供应商清单(imports 文件),根据合同条款(条件注解),找来所有合适的供应商(自动配置类),让他们提供物资(Bean)。于是工厂瞬间就拥有了运转所需的一切。

这就是 Spring Boot 自动配置,它之所以强大,不是因为它会帮你做一切,而是因为它​​聪明地、有选择地​​帮你做掉了那些繁琐的、通用的配置工作,同时​​无比尊重你的决定​​,随时准备被你的自定义配置所覆盖。

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

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

相关文章

【CSS,DaisyUI】自定义选取内容的颜色主题

当你的网站使用了多个主题,比如 light/dark。当用户选择一段文本,常常会出现一个主题没问题,另一个主题颜色怪怪的。是因为选择区域的主题通常没有变化,导致与当前主题不配合。 下面四种方法可解决这个问题: The probl…

Linux网络接口命名详解:从eth0到ens33

在Linux系统中,网络接口的命名方式直接影响管理员对设备的理解与管理。从早期的eth0、wlan0到现代的ens33、enp0s3、eno1,Linux网络接口命名规则经历了显著的演变。一、Linux网络接口命名的历史与演变 Linux网络接口命名的历史可以分为两个主要时代&…

如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用?

url: /posts/2d992ef9e8962dc0a4a0b5348d486114/ title: 如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用? date: 2025-09-06T03:34:14+08:00 lastmod: 2025-09-06T03:34:14+08:00 author: cmdragon summary: FastAPI 的依赖注入系统允许解耦复杂依赖关系,便于代码重…

linux上nexus安装教程

下载页面 https://help.sonatype.com/en/download.html选择 Unix/Linux Arch64 一栏点击下载; 选择非root 组的用户登录linux ,此处注意必须保证linux内存大于4G,否则无法启动 解压nexus包 tar -xzvf nexus-3.83.2-01-linux-aarch_64.tar.gz进入bin目录 …

大语言模型的“思考”逻辑:从Token生成到上下文理解的内部流程

当你问“明天天气如何”时,AI在“想”什么?当你向ChatGPT或文心一言输入“明天北京天气如何”,模型秒速回复“明天北京晴转多云,气温15-25℃”——这个过程看似“思考”,实则是一套精密的“数据处理流水线”。大语言模…

Linux笔记---TCP套接字编程

1. 核心接口 1.1 监听连接&#xff1a;listen() 使 TCP 套接字进入被动监听状态&#xff0c;准备接受客户端连接&#xff08;仅服务器端使用&#xff09;。 #include <sys/socket.h>int listen(int sockfd, int backlog); 参数&#xff1a; sockfd&#xff1a;已绑定…

从零开始的python学习——文件

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;python学习专栏&#xff1b; 文章目录 前言 一、文件是什么 二、文件路径 三、文件操作 &#xff08;1&#xff09;打开文件 …

set与multset的区别;less greater 函数对象实现比较 作为排序依据

Set 和 multiset 特点 set中元素插入过程是按排序规则插入&#xff0c;所以不能指定插入位置。set不可以直接存取元素。&#xff08;不可以使用at.(pos)与[]操作符&#xff09;。multiset与set的区别&#xff1a;set支持唯一键值&#xff0c;每个元素值只能出现一次&#xff1b…

计算机视觉(八):开运算和闭运算

计算机视觉中的开运算&#xff08;Opening&#xff09;和闭运算&#xff08;Closing&#xff09;是两种非常重要的形态学&#xff08;Morphological&#xff09;图像处理操作。它们主要用于图像的去噪、分割、特征提取等任务。这两种运算都基于两种更基础的操作&#xff1a;腐蚀…

nginx常用命令(备忘)

一、引言&#xff1a;Nginx 为何成为前端开发必备工具 ** 在前端开发的广阔领域中&#xff0c;Nginx 已然成为了一个不可或缺的强大工具。它是一款轻量级的 HTTP 服务器和反向代理服务器&#xff0c;采用事件驱动的异步非阻塞处理方式框架&#xff0c;这赋予了它卓越的 I/O 性…

告别Qt Slider!用纯C++打造更轻量的TpSlider组件

组件运行效果展示 组件概述 TpSlider组件简介 TpSlider是PiXSingleGUI库中的可拖动滑块组件&#xff0c;支持水平和垂直两种方向的滑动操作。TpSlider.h:13-17该组件提供了完整的用户交互功能&#xff0c;包括鼠标拖拽、数值范围设置和实时反馈机制。 核心特性 双向支持&am…

sensitive-word 敏感词性能提升14倍优化全过程 v0.28.0

背景 有一天&#xff0c;群里收到小伙伴提的一个问题&#xff0c;为什么程序 sensitive-word 第一次执行这么慢? sensitive-word-131 初步验证 自己本地用 v0.27.1 验证了一下&#xff0c;确实很奇怪&#xff0c;第一次明显很慢。 为了排除一些干扰项&#xff0c;我们把一些…

4.6 多个光源

1.Include Files 2.The Second Light 3.Point Light1.Include Files 为了在着色器中实现多光源支持, 我们需要添加更多通道; 这些通道会包含几乎相同的代码, 为了避免代码重复, 我们将着色器代码移到一个包含文件中; 与光照着色器相同的文件夹中创建一个后缀为.cginc的文件, 将…

ANSYS HFSS的简单认识

HFSS&#xff08;High Frequency Structure Simulator&#xff09;是ANSYS公司开发的一款用于高频电磁场仿真的行业标准软件。它通过“计算”电磁波在各种结构中的行为&#xff0c;来帮助工程师设计天线、滤波器、微波电路、高速电子封装等。我用一个简单易懂的比喻来帮你理解整…

Codeforces Round 1046 (Div. 2) vp补题

只是签了三道题就燃尽了… 原题连接 A //不可能连续进三球 得分值差最多的只有00X00X00X00 bool jud(int a,int b){if(a!0&&b!0&&max(a,b)-2*(min(a,b)1)>1)return 0;if(a0||b0){if(abs(a-b)>3)return 0;}return 1; } void solve() {int a,b,c,d;cin…

水泵运行组态监控系统御控物联网解决方案

一、方案背景与需求分析随着工业4.0和智慧城市建设的推进&#xff0c;传统水泵监控方式存在数据孤岛、响应滞后、运维成本高等问题。本方案通过物联网&#xff08;IoT&#xff09;技术构建水泵运行组态监控系统&#xff0c;实现设备状态实时感知、故障预警、远程调控及能效优化…

海尔电视刷机

硬盘格式化只有ntfs和exfat怎么办&#xff0c;没有fat32 这台型号le32c31 连有线几天后突然卡系统启动中 电视系统崩溃了怎么办&#xff1f;一直显示启动中&#xff01;三分钟解决问题&#xff0c;只要五元搞定&#xff01;_哔哩哔哩_bilibili format H: /fs:FAT32 慢 disk…

Science Advances副主编:如何提高论文投稿接收率?

国际著名综合性学术期刊《Science Advances》每年可接到约20000份投稿&#xff0c;有高达90%的拒稿率&#xff0c;大部分稿件甚至没有进入评审阶段&#xff0c;作为该期刊的副主编之一&#xff0c;杜克大学的Warren Warren教授撰写了文章&#xff0c;给投稿人提出几点建议以提高…

少儿配音教育:广州声与色在线科技有限公司打造趣味课程,助力青少年语言能力提升

针对青少年语言表达能力培养需求&#xff0c;广州声与色在线科技有限公司推出 “少儿配音趣味课程”&#xff0c;通过动画、童话等青少年喜爱的形式&#xff0c;融合发声训练与兴趣培养&#xff0c;成为少儿素质教育的新选择。课程设计贴合 8-15 岁青少年认知特点&#xff1a;分…

【架构艺术】变更风险防控架构嵌入决策降噪模块的方法

在先前的文章中&#xff0c;我们聊到了一个变更观测任务可以通过什么样的方式对不同的变更防控能力做统一调度&#xff0c;达到优越的变更风险拦截效果。但是在实战当中&#xff0c;变更观测任务集成了很多能力&#xff0c;即便风险拦截率很高&#xff0c;但不同能力效果也有差…