【杂类】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 自动配置,它之所以强大,不是因为它会帮你做一切,而是因为它​​聪明地、有选择地​ ​帮你做掉了那些繁琐的、通用的配置工作,同时​​无比尊重你的决定​​,随时准备被你的自定义配置所覆盖。

相关推荐
小小菜鸡ing6 小时前
pymysql
java·服务器·数据库
getapi6 小时前
shareId 的产生与传递链路
java
我没想到原来他们都是一堆坏人7 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民7 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
mabo_9704@163.com7 小时前
SpringAI调用MCP服务的实现思路
spring·ai
小小工匠7 小时前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils
Jerry&Grj8 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员8 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
用户8160791833338 小时前
告别“魔法”:包你解决 Gradle 的下载慢问题
java