一、自动配置核心原理
SpringBoot 的自动配置,本质是遵循 "约定大于配置",通过条件注解 + 自动配置类,在启动时自动将符合条件的 Bean 注入到 IOC 容器中。
1. 触发入口:@SpringBootApplication
启动类上的 @SpringBootApplication 是自动配置的入口,它组合了三个核心注解:
@SpringBootConfiguration:标记为配置类@ComponentScan:组件扫描@EnableAutoConfiguration:自动配置开关(核心)
2. @EnableAutoConfiguration 如何工作?
该注解内部通过 @Import(AutoConfigurationImportSelector.class) 导入了自动配置选择器,核心流程如下:
- 读取配置文件 :
AutoConfigurationImportSelector会读取spring-boot-autoconfigure模块中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件(SpringBoot 2.7+ 版本,旧版本为spring.factories),文件中定义了所有自动配置类的全限定名。 - 过滤自动配置类 :根据条件注解(如
@ConditionalOnClass、@ConditionalOnMissingBean)筛选符合当前环境的自动配置类。 - 加载并注册 Bean :将符合条件的自动配置类加载到 Spring 容器中,其中通过
@Bean定义的 Bean 会被自动注册。
3. 示例:DispatcherServlet 自动配置
当引入 spring-boot-starter-web 依赖时:
- 自动配置类
DispatcherServletAutoConfiguration被加载 - 该类上标注了
@ConditionalOnClass(DispatcherServlet.class),只有项目中存在DispatcherServlet类时,配置才生效 - 配置类中通过
@Bean定义了DispatcherServlet,启动时自动注入到 IOC 容器中
二、自定义 Starter 实现公共组件自动配置
在实际开发中,可将公共组件封装为 Starter,让其他项目直接引入即可使用,无需手动配置。
1. 场景与结构
以自定义 MyBatis Starter 为例,Starter 分为两个模块:
表格
| 模块 | 作用 |
|---|---|
dmybatis-spring-boot-autoconfigure |
提供自动配置逻辑,定义 Bean 注册规则 |
dmybatis-spring-boot-starter |
依赖管理模块,仅引入 autoconfigure 模块,简化依赖引入 |
2. 实现步骤
步骤 1:创建 autoconfigure 模块,编写自动配置类
java
运行
@Configuration
public class CommonConfig {
// 示例:根据配置文件条件注册 Bean
@Bean
@ConditionalOnProperty(prefix = "country", name = {"name", "system"})
public Country country(@Value("${country.name}") String name,
@Value("${country.system}") String system) {
return new Country(name, system);
}
@Bean
public Province province() {
return new Province();
}
}
步骤 2:创建自动配置入口类
java
运行
@AutoConfiguration
@Import(CommonConfig.class)
public class CommonAutoConfig {
}
步骤 3:配置自动配置加载文件
在 autoconfigure 模块的 resources/META-INF/spring/ 目录下,创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,写入自动配置类的全限定名:
text
cn.itcast.config.CommonAutoConfig
步骤 4:创建 starter 模块,引入 autoconfigure 依赖
在 starter 模块的 pom.xml 中仅引入 autoconfigure 模块:
xml
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>dmybatis-spring-boot-autoconfigure</artifactId>
<version>1.0.0</version>
</dependency>
3. 其他项目使用自定义 Starter
只需在项目中引入 starter 依赖,即可自动加载 CommonAutoConfig 中的配置,无需手动 @Import:
xml
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>dmybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
三、核心总结
- 自动配置的本质 :通过
@EnableAutoConfiguration+AutoConfigurationImportSelector读取配置文件中的自动配置类,结合条件注解筛选后注册 Bean。 - 自定义 Starter 关键 :
- 分为
autoconfigure(配置逻辑)和starter(依赖管理)两个模块 - 在
autoconfigure中通过AutoConfiguration.imports文件声明自动配置类 - 利用条件注解控制 Bean 的注册时机
- 分为
- 优势:封装公共组件,简化其他项目的配置流程,实现 "开箱即用"。
💡 常见问题:SpringBoot 2.7 前后自动配置文件的变化
- 2.7 版本前:使用
META-INF/spring.factories文件 - 2.7 版本后:使用
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,结构更清晰,支持按条件过滤