Spring Boot 自动配置原理概述
Spring Boot自动配置通过约定优于配置的理念,根据类路径下的依赖自动配置Spring应用。
核心组件
@SpringBootApplication
Java
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
// 等价于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication { ... }
@EnableAutoConfiguration
Java
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
}
自动配置流程
Java
启动 -> @EnableAutoConfiguration -> AutoConfigurationImportSelector
-> 读取spring.factories -> 加载自动配置类 -> 条件注解过滤 -> 注册Bean
AutoConfigurationImportSelector
properties
public class AutoConfigurationImportSelector implements DeferredImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
// 1. 读取spring.factories中的EnableAutoConfiguration配置
// 2. 去重、过滤
// 3. 应用条件注解
// 4. 返回需要加载的配置类
}
}
spring.factories机制
Java
# META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
条件注解过滤
YAML
@Configuration
@ConditionalOnClass(DataSource.class) // 类路径存在DataSource
@ConditionalOnMissingBean(DataSource.class) // 容器中没有DataSource
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnProperty(prefix = "spring.datasource", name = "type")
public DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
自动配置报告
Java
# 启用自动配置报告
debug: true
# 或
spring:
autoconfigure:
report:
enabled: true
启动后可在日志中查看自动配置匹配报告。
排除自动配置
text
// 方式一:注解排除
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
// 方式二:配置排除
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
要点总结
- @EnableAutoConfiguration触发自动配置
- AutoConfigurationImportSelector读取spring.factories
- 条件注解决定配置是否生效
- 可通过exclude排除特定自动配置
- debug=true查看自动配置报告
📝 发现内容有误?点击此处直接编辑