
Java面试经常会问到SpringBoot自动配置原理,下面我就来详解SpringBoot自动配置原理@mikechen
什么是springboot自动配置
Spring Boot的自动配置是一种机制,它可以根据应用程序的依赖关系和环境自动配置Spring应用程序所需的组件。
简单来说,Spring Boot的自动配置就是在Spring应用程序启动时自动为应用程序进行配置。
springboot自动配置注解
我们开发任何一个Spring Boot项目,都会用到如下的启动类:

我们点击这个注解,@SpringBootApplication,我标出来的这三个注解,如下图所示:

在Spring Boot自动配置就是通过上图的:@EnableAutoConfiguration注解实现的。
springboot自动配置原理
通过上面的注解演示,我们知道了Spring Boot自动配置是通过@EnableAutoConfiguration注解实现的。
这个注解是帮助我们自动加载默认配置的,它里面有两个关键注解@AutoConfigurationPackage和@Import。
我们再进一步,点进该注解,可以看到@EnableAutoConfiguration包含:
@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 {};
}
这里导入AutoConfigurationImportSelector类,这个类中有一个非常重要的方法:selectImports。
如下所示:
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//检查自动配置功能是否开启,默认开启
if (!isEnabled(annotationMetadata)) {
return NO_IMPORTS;
}
//加载自动配置的元信息
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
.loadMetadata(this.beanClassLoader);
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//获取候选配置类
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
//去掉重复的配置类
configurations = removeDuplicates(configurations);
//获得注解中被exclude和excludeName排除的类的集合
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
//检查被排除类是否可实例化、是否被自动注册配置所使用,不符合条件则抛出异常
checkExcludedClasses(configurations, exclusions);
//从候选配置类中去除掉被排除的类
configurations.removeAll(exclusions);
//过滤
configurations = filter(configurations, autoConfigurationMetadata);
//将配置类和排除类通过事件传入到监听器中
fireAutoConfigurationImportEvents(configurations, exclusions);
//最终返回符合条件的自动配置类的全限定名数组
return StringUtils.toStringArray(configurations);
}
selectImports实现自动装配的所有处理逻辑,包括:
- 获得候选配置类;
- 配置类去重;
- 排除不需要的配置类;
- 过滤等;
最终返回符合条件的自动配置类的全限定名数组。
@EnableAutoConfiguration,就像一只“八爪鱼”一样,如下图所示:

借助于Spring框架原有的一个工具类:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自动配置功效才得以大功告成。
当应用程序启动时,Spring Boot会自动扫描应用程序的依赖,根据依赖中的类和类路径上的元数据(比如META-INF/spring.factories文件)来决定哪些配置类应该被加载。
以上就是springboot自动配置原理详解,更多内容请查看:SpringBoot框架教程(详细图文详解)
关于mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。