目录
[一、什么是 Spring Boot 自动装配?](#一、什么是 Spring Boot 自动装配?)
[四、@EnableAutoConfiguration 做了什么?](#四、@EnableAutoConfiguration 做了什么?)
[八、Starter 与自动装配的关系](#八、Starter 与自动装配的关系)
[十一、Spring Boot 2.x vs 3.x 简要说明](#十一、Spring Boot 2.x vs 3.x 简要说明)
Spring Boot 最吸引人的地方,并不是"能跑起来",
而是 "为什么什么都没配,却什么都有"。
数据源、MVC、Tomcat、Jackson、事务......
这些能力并不是魔法,而是 Spring Boot 自动装配机制 在背后完成的。
本文将系统拆解 Spring Boot 自动装配的完整原理。
一、什么是 Spring Boot 自动装配?
自动装配(Auto Configuration) 指的是:Spring Boot 根据当前项目的依赖、环境和配置,自动为应用配置合适的 Spring 组件。
核心思想只有一句话:"你引什么依赖,我就帮你配什么 Bean。
二、自动装配解决了什么问题?
在传统 Spring 项目中:
- 需要大量 XML / JavaConfig
- 手动声明 Bean
- 处理依赖顺序和条件判断
而 Spring Boot 通过自动装配,实现了:
- 减少配置
- 消除样板代码
- 提供"开箱即用"的体验
自动装配不是"少配置",而是"合理的默认配置"。
三、自动装配从哪里开始?
入口注解:@SpringBootApplication
java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
它是一个组合注解,核心是:@EnableAutoConfiguration
真正开启自动装配的,是 @EnableAutoConfiguration。
四、@EnableAutoConfiguration 做了什么?
@EnableAutoConfiguration 本身并不直接"配置 Bean",
它做的只有一件事:导入一大批自动配置类。
底层实现依赖:
java
@Import(AutoConfigurationImportSelector.class)
五、自动配置类是从哪里来的?
答案:spring.factories(Spring Boot 2.x)
Spring Boot 会在启动时扫描所有依赖 Jar 包中的:
META-INF/spring.factories
其中有一项非常关键:
org.springframework.boot.autoconfigure.EnableAutoConfiguration
对应的值是:一长串 AutoConfiguration 类的全限定名
例如:
- DataSourceAutoConfiguration
- WebMvcAutoConfiguration
- JacksonAutoConfiguration
- TransactionAutoConfiguration
这些类才是真正的"自动装配实现者"。
六、为什么不会全部生效?
Spring Boot 并不会无脑加载所有自动配置类,而是依赖 条件注解(@Conditional)。
七、条件装配机制(自动装配的核心)
自动配置类上大量使用了 @Conditional 系列注解:
常见条件注解
- @ConditionalOnClass
- @ConditionalOnMissingBean
- @ConditionalOnBean
- @ConditionalOnProperty
举个例子:数据源自动配置
java
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
}
含义是:
- 类路径下存在 DataSource
- 容器中还没有 DataSource Bean
- 才会进行自动配置
自动装配 = 条件满足才装配。
八、Starter 与自动装配的关系
很多人以为:引入 starter = 自动装配
更准确的说法是:Starter 提供依赖,AutoConfiguration 提供配置。
spring-boot-starter-web 做了什么?
- 引入:
- Spring MVC
- Tomcat
- Jackson
- 触发:
- WebMvcAutoConfiguration
- DispatcherServlet 自动注册
Starter 是"触发器",自动配置是"执行者"。
九、自动装配的完整执行流程
一条完整链路如下:
- 启动类加载
- @EnableAutoConfiguration 生效
- AutoConfigurationImportSelector 工作
- 扫描 spring.factories
- 加载所有自动配置类
- 条件注解判断是否生效
- 满足条件 → 注册 Bean
- Spring 容器启动完成
十、为什么可以"覆盖"自动配置?
Spring Boot 允许我们:
- 自定义 Bean
- 覆盖默认配置
原因就在于:@ConditionalOnMissingBean
你自己定义的 Bean,优先级永远高于自动配置。
这也是 Spring Boot "不强侵入"的关键设计。
十一、Spring Boot 2.x vs 3.x 简要说明
Spring Boot 2.x:spring.factories
Spring Boot 3.x:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
思想不变,只是加载方式升级。
十二、一句话总结
Spring Boot 通过 @EnableAutoConfiguration 加载自动配置类,并借助条件注解按需向容器中注册 Bean。