Spring Boot 自动配置
目录
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
一、自动装配的核心机制
二、源码分析流程
2.1 起点:@SpringBootApplication
2.2 @EnableAutoConfiguration 的作用
2.3 AutoConfigurationImportSelector 源码分析
2.4 自动配置类加载过程
2.5 自动配置类的条件过滤
条件注解过滤逻辑
三、自动装配完整流程
@SpringBootApplication
@SpringBootApplication 是 Spring Boot 应用的核心入口注解,它通过组合多个关键注解简化了SpringBoot应用的配置。
@SpringBootConfiguration
- 作用:标识当前类是一个 Spring Boot 的配置类
- 源码:本质上是 @Configuration 的别名
- 功能:等价于 @Configuration ,表示该类中可能定义
@Bean
方法
@EnableAutoConfiguration
启用 Spring Boot 的自动装配机制。
本章内容重点讨论这个注解
@C
omponentScan
自动扫描并注册当前包及其子包下的组件(如
@Component
,@Service
,@Controller
)。若未指定
basePackages
,则扫描主类所在的包及其子包。
Spring Boot的自动装配(Auto-Configuration)是其核心特性之一。
它通过约定大于配置的方式,自动加载符合条件的Bean到Spring容器中。
一、自动装配的核心机制
自动装配基于以下核心组件实现:
- @EnableAutoConfiguration 注解
- 触发自动装配的入口。
spring.factories 文件(Spring Boot 2.x)或 AutoConfiguration.improts(Spring Boot 3.x)
- 定义自动配置类的列表
@ConditionalOnXXX(eg. @ConditionalOnClass)
- 决定是否加载某个配置
二、源码分析流程
2.1 起点:@SpringBootApplication
Spring Boot应用的启动类通常标注 @SpringBootApplication,该注解是一个组合注解:
@SpringBootConfiguration @EnableAutoConfiguration // 关键注解,触发自动装配 @ComponentScan public @interface SpringBootApplication {}
2.2 @EnableAutoConfiguration 的作用
@EnableAutoConfiguration 通过 @Import 引入了 AutoConfigurationImportSelector类:
2.3 AutoConfigurationImportSelector 源码分析
注:这里以Spring Boot 3.1.2版本为例,
上面说到了 3.xx版本会读取 AutoConfiguration.imports 文件,2.xx 版本会读取 spring.factories 文件
- AutoConfigurationImportSelector 负责加载所有自动装配类:
关键方法
getAutoConfigurationEntry
:
从
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(Spring Boot 3.x+)或spring.factories
(Spring Boot 2.x)加载配置类列表。过滤掉不满足条件的配置类(基于条件注解)。
2.xx版本:
SpringFactoriesLoader.loadSpringFactories()
方法负责加载配置类
2.4 自动配置类加载过程
以 Spring Boot 3.x 为例,自动配置类定义在文件中:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容示例:
2.5 自动配置类的条件过滤
自动配置类通常包含条件注解,例如
DataSourceAutoConfiguration
:@AutoConfiguration @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) // 类路径存在时才生效 @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") // 容器中不存在指定 Bean 时生效 @EnableConfigurationProperties(DataSourceProperties.class) public class DataSourceAutoConfiguration { // 自动创建 DataSource Bean @Bean @ConditionalOnMissingBean(DataSource.class) public DataSource dataSource(...) { ... } }
条件注解过滤逻辑
OnClassCondition
是@ConditionalOnClass
的实际执行类public class OnClassCondition extends FilteringSpringBootCondition { @Override protected ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses, AutoConfigurationMetadata metadata) { // 检查类路径是否存在指定类 for (String autoConfigurationClass : autoConfigurationClasses) { String onClass = metadata.get(autoConfigurationClass, "ConditionalOnClass"); if (onClass != null && !ClassUtils.isPresent(onClass, classLoader)) { return ConditionOutcome.noMatch("Required class not found: " + onClass); } } ... } }
三、自动装配完整流程
启动类扫描:
@SpringBootApplication
触发@EnableAutoConfiguration
。加载配置类列表:
AutoConfigurationImportSelector
读取AutoConfiguration.imports
或spring.factories
文件。过滤配置类:通过条件注解(如
@ConditionalOnClass
)排除不满足条件的配置类。注册 Bean:剩余的配置类通过
@Bean
方法向容器注册组件。