【SpringBoot】自动装配原理:全方位超全解析
文章目录
前言
本文包含总结了SpringBoot自动装配原理,覆盖了自动配置的 “依赖 - 入口 - 流程 - 特性” 全链路,每个环节都包含了关键细节,部分含详细源码解析。
一、核心认知
SpringBoot的自动装配是通过预先定义的规则,在引入对应依赖、满足特定条件时,自动向 Spring 容器注册组件并绑定配置,无需手动编写 XML 或 Java 配置,核心依赖spring-boot-autoconfigure与各类starter协同生效。但是一定要清楚,用户配置是优先于自动装配的,换句话说,SpringBoot 自动配置是 “约定大于配置” 思想的实现。
其本质就记住四个词:提前封装,条件判断,配置绑定,按需装配。
二、依赖与配置:自动装配的基石
1.引入依赖
spring-boot-autoconfigure依赖是自动装配的核心依赖,其被封装在对应的starter中,而starter本质是 “依赖组合包”—— 既引入spring-boot-autoconfigure,又引入对应功能的底层依赖。这两者缺一不可,只有引入对应starter,其关联的自动配置才可能生效。
2.配置绑定逻辑
底层通过xxxProperties类实现。
定义默认值:xxxProperties类通过@ConfigurationProperties(prefix = “前缀”)注解,将字段与配置文件(application.properties/yaml)的特定前缀绑定,默认值直接定义在字段上。
用户配置覆盖:用户在application.properties中配置会覆盖掉默认的配置。
举个简单的例子:ServerProperties绑定server.*,字段port默认值为 8080,而如果用户在application.properties中配置server.port=8081,会自动覆盖ServerProperties的默认值。
三、引导类:自动装配的入口
SpringApplication.run(引导类.class)是启动入口,其核心是@SpringBootApplication复合注解,由三个关键注解组成,共同触发容器初始化与自动配置。下面将重点详细讲解三个注解的是怎么实现自动装配的。
其代码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//以下三大注解是重点!
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}
1.@SpringBootConfiguration:标记配置类
@SpringBootConfiguration底层直接继承了@Configuration,这说明说明引导类本身就是 Spring 的配置类,可直接在引导类中用@Bean注册自定义组件。
2. @ComponentScan:指定组件扫描范围
默认规则是:扫描引导类所在包及其所有子包,加载带@Controller/@Service/@Component等注解的组件。
可以看到源码中加了两个关键过滤:其中TypeExcludeFilter是Spring内部使用的过滤器,主要用于测试场景,允许测试代码排除某些组件,这个无需我们过度关注;而AutoConfigurationExcludeFilter是核心的过滤逻辑,排除所有自动配置类,确保自动配置类由@EnableAutoConfiguration单独处理,不与常规组件扫描混淆。
那么就是说,下面的注解是自动配置的核心!
3. @EnableAutoConfiguration:自动配置的 “开关”(重点!)
这个是触发自动配置的关键注解,底层由两个子注解支撑:
- @AutoConfigurationPackage:定义默认扫描包
通过@Import(AutoConfigurationPackages.Registrar.class)实现:Registrar类会将引导类所在的包路径注册为 Spring 的 “默认组件扫描包”,与@ComponentScan的默认范围一致。
在此源码上打断点,右键打开Evaluate Expression(评估表达式),可以看到Register.class的扫描范围,它将主配置类(@SpringBootApplication 标注的类)的所在包及下面所有子包里面的所有组件扫描到 Spring 容器。
下图为Register.class的扫描范围
2. @Import(AutoConfigurationImportSelector.class):加载候选自动配置类
AutoConfigurationImportSelector类中包含两个核心方法:selectImports和getCandidateConfigurations。
selectImports底层调用getAutoConfigurationEntry,而getAutoConfigurationEntry,向容器中导入了一系列组件,selectImports决定导入的组件。
下图为getAutoConfigurationEntry导入的各种组件中的一部分
getCandidateConfigurations:获取了要导入容器的配置类,其中调用了SpringFactoriesLoader.loadFactoryNames方法,利用工厂加载了一些组件,并在"META-INF/spring.factories"加载了对应的配置类
下图为Spring 的 “工厂加载器”
随后底层读取key=org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的所有value,即候选自动配置类列表(约 200 + 个)。
以下为总结的核心流程
四、自动装配流程梳理
1. 触发流程
SpringApplication.run()启动后,@EnableAutoConfiguration生效,触发AutoConfigurationImportSelector加载候选类。
2. 加载候选类
通过SpringFactoriesLoader加载META-INF/spring.factories中的所有候选自动配置类。
3. 筛选生效类
候选类经过 3 层筛选,仅保留满足条件的配置类:
① 去重:排除重复的配置类(避免依赖冲突导致的重复加载)。
② 排除:根据@EnableAutoConfiguration的exclude/excludeName属性,排除用户指定的配置类(如@SpringBootApplication(exclude = DataSourceAutoConfiguration.class))。
③ 条件匹配:通过@Conditional系列注解判断是否生效(最关键的筛选逻辑)。
以下是几个常见的注解
| 注解 | 作用 |
|---|---|
| @ConditionalOnClass | 类路径存在指定类时生效 |
| @ConditionalOnMissingBean | 容器中不存在指定 Bean 时生效 |
| @ConditionalOnProperty | 配置文件存在指定键值对时生效 |
| @ConditionalOnWebApplication | 是 Web 应用时生效 |
4. 绑定配置值
生效的xxxAutoConfiguration会通过@EnableConfigurationProperties(xxxProperties.class),将xxxProperties类与配置文件绑定,获取 “默认值 + 用户配置” 的最终参数。
5. 注册组件
生效的xxxAutoConfiguration向 Spring 容器注册对应的功能组件,组件注册后,对应的功能(Web 请求处理、Tomcat 启动、视图解析等)即可直接使用,无需手动配置。
五、用户配置优先于自动配置
Spring Boot 遵循 “用户配置 > 自动配置 > 默认值” 的优先级,确保灵活性!这是Springboot的关键特性!
总结
一定记住提前封装、条件判断、配置绑定、按需装配四大核心逻辑~
注:以上总结根据SpringBoot2.6.13源码分析,部分版本(尤其3.0+)可能有差别,但整体逻辑基本不变。
更多推荐

所有评论(0)