Spring Boot @EnableAutoConfiguration注解
@EnableAutoConfiguration是Spring Boot自动配置的核心注解,通过@Import机制导入自动配置类。
注解定义
Java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
// 覆盖自动配置的配置属性名
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
// 排除特定的自动配置类
Class<?>[] exclude() default {};
// 根据类名排除自动配置类
String[] excludeName() default {};
}
@AutoConfigurationPackage
Java
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage { }
// Registrar将主配置类所在包注册为基础包
// 供@ComponentScan等组件扫描使用
AutoConfigurationImportSelector
核心方法
Java
public class AutoConfigurationImportSelector implements DeferredImportSelector,
BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
AutoConfigurationEntry autoConfigurationEntry =
getAutoConfigurationEntry(annotationMetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
protected boolean isEnabled(AnnotationMetadata metadata) {
// 可通过spring.boot.enableautoconfiguration=false禁用
return getEnvironment().getProperty(ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
}
}
加载流程
Java
selectImports()
-> getAutoConfigurationEntry()
-> getCandidateConfigurations() // 获取候选配置
-> SpringFactoriesLoader.loadFactoryNames() // 读取spring.factories
-> removeDuplicates() // 去重
-> getExclusions() // 获取排除项
-> filter() // 条件过滤
排除配置
注解方式
YAML
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
RedisAutoConfiguration.class
})
@EnableAutoConfiguration(excludeName = {
"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"
})
配置方式
Java
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
DeferredImportSelector特性
YAML
// AutoConfigurationImportSelector实现DeferredImportSelector
// 延迟加载,确保所有常规配置类先处理
public interface DeferredImportSelector extends ImportSelector {
// 比普通ImportSelector晚执行
// 保证用户自定义配置优先
}
禁用自动配置
text
# 禁用所有自动配置(极少使用)
spring:
boot:
enableautoconfiguration: false
要点总结
- @EnableAutoConfiguration组合@AutoConfigurationPackage和@Import
- AutoConfigurationImportSelector读取spring.factories加载配置类
- exclude/excludeName排除特定自动配置
- 实现DeferredImportSelector延迟加载
- 可通过配置属性禁用自动配置
📝 发现内容有误?点击此处直接编辑