Spring Boot - 自动配置原理
Spring Boot 核心 —— 自动配置原理
1. 核心思想:约定优于配置
Spring Boot 的设计哲学是“约定优于配置” (Convention over Configuration)。它旨在尽可能快地、最小化配置地创建出独立的、生产级的 Spring 应用。
- Spring Framework: 像一大堆乐高积木,灵活但费力。
- Spring Boot: 像一个乐高套装,附带说明书(自动配置),让你快速搭建出完整模型。
自动配置是 Spring Boot 最核心的特性,它的工作原理可以总结为“启动、加载、筛选、生效”四个步骤。
2. 自动配置的四个核心步骤
第一步:启动 -> @SpringBootApplication 注解
这一切都始于主启动类上的 @SpringBootApplication 注解。它其实是一个复合注解,主要由三个更小的注解组成:
@SpringBootConfiguration:表明这是一个 Spring Boot 的配置类,本质上就是@Configuration。@ComponentScan:启用组件扫描,让 Spring 去发现我们自己定义的 Bean(比如@Service,@Controller等)。@EnableAutoConfiguration:这是自动配置的核心开关。
第二步:加载 -> @EnableAutoConfiguration 与 spring.factories
@EnableAutoConfiguration 注解通过 @Import 导入了 AutoConfigurationImportSelector 这个类。这个类的核心作用就是:
- 扫描 Jar 包:它会去扫描应用 classpath 下所有 jar 包中的
META-INF/spring.factories文件。(在 Spring Boot 2.7+ 版本中,这个文件是META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)。 - 收集配置类:在这些文件中,它会找到以
org.springframework.boot.autoconfigure.EnableAutoConfiguration作为 Key 的配置项,这个 Key 下面定义了所有需要被自动配置的类的完整路径名,比如DataSourceAutoConfiguration、WebMvcAutoConfiguration等。
AutoConfigurationImportSelector 会把这些类的名字都收集起来,形成一个自动配置类的“候选名单”。
第三步:筛选 -> @Conditional 条件注解
Spring Boot 并不会加载所有候选的自动配置类,而是会通过一系列的 @Conditional 条件注解来进行智能筛选。这些注解就像一个个“开关”,只有满足特定条件,对应的自动配置类才会生效。
最常见的条件注解有:
-
@ConditionalOnClass: 判断 classpath 中是否存在某个类。- 场景:
DataSourceAutoConfiguration上有@ConditionalOnClass(DataSource.class)。只有当你引入了数据库驱动(如mysql-connector-java),classpath 里才会有DataSource这个类,Spring Boot 才会去尝试帮你自动配置数据源。
- 场景:
-
@ConditionalOnMissingBean: 判断容器中是否不存在某个类型的 Bean。- 场景:在
DataSourceAutoConfiguration内部,定义DataSourceBean 的方法上就有@ConditionalOnMissingBean(DataSource.class)。这意味着,如果你自己手动配置了一个DataSourceBean,那 Spring Boot 的自动配置就会自动“退让”,使用你定义的 Bean。这完美体现了“约定优于配置”的思想。
- 场景:在
-
其他常用条件:
@ConditionalOnProperty:判断配置文件中是否有某个属性。@ConditionalOnWebApplication:判断当前是否是 Web 环境。
第四步:生效 -> 装配 Bean
经过 @Conditional 注解的层层筛选后,最终“存活”下来的自动配置类才会被 Spring IoC 容器加载。容器会实例化这些配置类,并执行其中的 @Bean 方法,将一个个配置好的 Bean(比如 DataSource, JdbcTemplate, DispatcherServlet 等)装配到容器中,至此,自动配置完成。
3. 总结:完整的流程
@SpringBootApplication 触发 -> @EnableAutoConfiguration 生效 -> AutoConfigurationImportSelector 读取所有 starter 中的 spring.factories 文件,加载候选配置类 -> @Conditional 注解根据当前环境(如 classpath、用户自定义的 Bean 等)进行筛选 -> 最终通过的配置类被加载,其定义的 Bean 被注入到容器中。
这个机制的核心就是 Starter 负责“引入依赖”,自动配置负责“按需装配”。
例如,当我们引入 spring-boot-starter-web 时:
- 相关的依赖(如 Tomcat, Spring MVC)被添加到 classpath。
- 这满足了
WebMvcAutoConfiguration等配置类的@ConditionalOnClass条件。 - 如果用户没有自定义相关的 Bean(满足
@ConditionalOnMissingBean),WebMvcAutoConfiguration就会生效。 - 它会自动配置好
DispatcherServlet、Tomcat服务器等所有 Web 开发需要的核心组件。
我们无需任何 XML 配置,就完成了一个功能完整的 Web 应用的搭建。

浙公网安备 33010602011771号