当前位置: 首页 > news >正文

【杂类】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.xdnf.cn/news/1480213.html

相关文章:

  • 基于多级特征编码器用于声学信号故障检测模型
  • 嵌入式学习日记
  • Linux系统编程—进程控制
  • 产品更新与路线图平台ShipShipShip
  • Java中的字符串
  • 提示词工程(Prompt Engineering)的崛起——为什么“会写Prompt”成了新技能?
  • Wisdom SSH 是一款创新性工具,通过集成 AI 助手,为服务器性能优化带来极大便利。
  • 【FastDDS】Layer Transport ( 04-TCP Transport )
  • 数据库中间件ShardingSphere v5.2.1
  • (算法 哈希表)【LeetCode 242】有效的字母异位词
  • 关于 React 19 的四种组件通信方法
  • 十三、计算机领域英语
  • TDengine 时间函数 WEEKOFYEAR() 用户手册
  • 【C++框架#3】Etcd 安装使用
  • Blender 3D建模工具学习笔记
  • LeetCode15:三数之和
  • 《MATLAB 批量把振动 CSV(含中文“序号/采样频率”)稳健转成 .mat:自动解析+统一换算+按 H/I/O/F-rpm-fs-load 命名》
  • WIN10+ubuntu22.04.05双系统装机教程
  • 基于STM32F103C8T6的心率与体温监测及报警显示系统设计
  • 如何在 FastAPI 中巧妙覆盖依赖注入并拦截第三方服务调用?
  • vue + ant-design-vue + vuedraggable 实现可视化表单设计器
  • 用 PHP 玩向量数据库:一个从小说网站开始的小尝试
  • 多维度数据统一线性处理的常见方案
  • 鸿蒙libxm2交叉编译
  • (2)桌面云、并行计算、分布式、网格计算
  • LeetCode5最长回文子串
  • 基于Spark的中文文本情感分析系统研究
  • 空间配置器
  • 【STM32HAL-----NRF24L01】
  • leetcode LCR 159 库存管理III