spring boot自动配置类源自classpath下所有jar包meta-inf/spring.factories中org.springframework.boot.autoconfigure.enableautoconfiguration键对应的值,经@enableautoconfiguration触发autoconfigurationimportselector,通过loadfactorynames加载、硬编码排除和@conditional条件注解动态筛选后排序注册。

要搞清楚Spring Boot启动时自动配置类从哪来、为什么只加载部分类、哪些类被跳过,必须直击spring.factories在源码中的真实调用链路和筛选逻辑。
第一步:@EnableAutoConfiguration触发AutoConfigurationImportSelector
当你在主类上标注@SpringBootApplication,它内部的@EnableAutoConfiguration就会生效。这个注解本身不干活,而是靠@Import(AutoConfigurationImportSelector.class)把一个选择器导入容器。
这个选择器不是普通Bean,而是一个DeferredImportSelector——它会在所有@Configuration类解析完后、BeanDefinition注册前的特定阶段才执行selectImports方法。
第二步:loadFactoryNames读取所有spring.factories文件
selectImports方法内部调用getAutoConfigurationEntry → getCandidateConfigurations → 最终进入SpringFactoriesLoader.loadFactoryNames。
这一步会扫描整个classpath下所有jar包的META-INF/spring.factories文件,包括spring-boot-autoconfigure.jar、mybatis-spring-boot-starter.jar、你自己写的starter.jar。
注意:它读取的是key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的所有value,用Properties方式解析,支持反斜杠换行和逗号分隔。
第三步:过滤——排除+条件判断才是真正的“自动”逻辑
方法一:硬编码排除
在@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})中声明的类,或通过spring.autoconfigure.exclude=xxx直接配置,会在getExclusions中被提取并从候选列表中移除。
方法二:条件注解动态筛除
每个候选配置类(如RedisAutoConfiguration)会被逐个检查其上的@ConditionalOnClass、@ConditionalOnMissingBean等注解。例如:
— @ConditionalOnClass(RedisTemplate.class):若类路径没有redis.clients.jedis.Jedis,则整个RedisAutoConfiguration类被跳过;
— @ConditionalOnMissingBean(CacheManager.class):若已有其他CacheManager Bean存在,该配置类中@Bean方法不会注册。
这一步没有任何日志输出,默认静默跳过,是调试自动配置失败最常踩的坑。
第四步:排序与注册
① 对剩余配置类按@AutoConfigureOrder、@AutoConfigureBefore/@AutoConfigureAfter进行拓扑排序,确保DataSourceAutoConfiguration在JpaRepositoriesAutoConfiguration之前执行。
② 将排序后的全限定类名数组返回给Spring容器。
③ 容器将这些字符串作为@Configuration类的BeanDefinition注册进BeanFactory,后续由ConfigurationClassPostProcessor解析其中的@Bean方法并创建实例。











