05.1 — 自动配置原理
Spring Boot 的核心思想是"约定优于配置"(Convention over Configuration),通过自动配置大幅简化 Spring 应用的搭建。
← 返回 **Spring Boot 索引**
1. @SpringBootApplication 组合注解
java
@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 {
// ...
}这三大注解的功能:
| 注解 | 作用 |
|---|---|
@SpringBootConfiguration | 本质是 @Configuration,标明是配置类 |
@EnableAutoConfiguration | 核心,开启自动配置机制 |
@ComponentScan | 包扫描,默认扫描启动类所在包及其子包 |
2. 自动配置原理
自动配置加载过程
第一步:@EnableAutoConfiguration 导入 AutoConfigurationImportSelector
第二步:AutoConfigurationImportSelector.selectImports() 加载所有候选自动配置类
第三步(Spring Boot 2.7+):从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 读取
# 文件内容示例(每行一个自动配置类全限定名)
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration第四步:对每个自动配置类进行条件评估(@ConditionalOnXxx),满足条件才注册 Bean
spring.factories vs AutoConfiguration.imports
| 版本 | 文件路径 | 说明 |
|---|---|---|
| Spring Boot 2.7 之前 | META-INF/spring.factories | 使用 SpringFactoriesLoader 加载 |
| Spring Boot 2.7+ | META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 专用文件,启动更快 |
为什么迁移?:spring.factories 是通用 SPI 文件被各种组件共享加载,移除自动配置项可以减少类路径扫描,提升启动速度。
常见面试题
- @SpringBootApplication 由哪些注解组成?各自的作用?
- 自动配置的实现原理?spring.factories 和 AutoConfiguration.imports 有何区别?
- Spring Boot 2.x 和 3.x 在自动配置上有什么变化?
← 返回 **Spring Boot 索引**