Spring Boot 自动配置原理一句话Spring Boot 启动时根据引入的 starter 和 application.yml 配置通过 Conditional 条件过滤候选自动配置类有条件地注册基础设施 Bean用户自定义优先框架默认兜底。1. 核心链路① 启动类 SpringBootApplication ├── SpringBootConfiguration配置类等价 Configuration ├── ComponentScan扫描业务 Bean └── EnableAutoConfiguration自动配置开关 ↓ ② Import(AutoConfigurationImportSelector.class) ↓ ③ 读取所有 jar 包的 META-INF/spring.factories 拿到候选自动配置类列表130 个 ↓ ④ 逐个检查每个自动配置类上的 Conditional 条件 满足 → 注册 Bean 不满足 → 跳过 ↓ ⑤ 最终通常只有 30~40 个自动配置类真正生效2. Conditional 条件注解家族自动配置类不是全部生效而是通过条件注解过滤注解判断依据举例ConditionalOnClassclasspath 里有某个类有 RedisTemplate.class → 说明引了 RedisConditionalOnProperty配置文件属性匹配pans.basic.cache.typeredis → 走 RedisConditionalOnMissingBean容器里还没人定义没自定义 DataSource → 帮你创建默认的ConditionalOnBean容器里已有某个 Bean有 DataSource → 才继续配事务管理器ConditionalOnWebApplication当前是 Web 应用才配 DispatcherServlet3. ConditionalOnMissingBean — 用户优先原则BeanConditionalOnMissingBeanpublicObjectMapperobjectMapper(){returnnewObjectMapper();}体现的核心设计原则你没用我帮你配一个默认的 你用了我尊重你不覆盖用户自定义的同类型 Bean 优先生效自动配置退让。这是 Spring Boot 灵活性的关键。4. spring.factories位置每个 starter jar 包的 META-INF/spring.factories 关键 key org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.xxx.RedisAutoConfiguration,\ com.xxx.DataSourceAutoConfiguration,\ ...130 个候选类 Spring Boot 3.x 新格式 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 作用列出所有候选自动配置类启动时由 AutoConfigurationImportSelector 读取注意这个文件在 jar 包内部不是在业务项目里。业务项目通过引 starter 来获得这些候选类。5. starter 是什么starter 不是功能代码本身而是依赖集合 自动配置入口spring-boot-starter-web 包含 ├── spring-webmvcSpring MVC ├── jacksonJSON 序列化 ├── tomcat内嵌 Web 容器 └── spring-boot-starter内含自动配置类入口企业项目里公司会把常用能力封装成平台 starterbasic-starter-cache → 引了就自动配好缓存能力 basic-starter-log → 引了就自动配好日志能力 basic-starter-data-translate → 引了就自动配好数据翻译能力业务项目只需要引依赖 写 application.yml 配置不需要手写 Bean。6. 自动配置 vs 组件扫描 vs MapperScan三者职责不同面试别混职责注解负责什么自动配置EnableAutoConfiguration框架基础设施 BeanDataSource、DispatcherServlet、TransactionManager 等组件扫描ComponentScan业务 BeanService、Controller、RepositoryMapper 扫描MapperScanMapper 接口默认 ComponentScan 只扫描启动类所在包及子包。如果业务代码在其他包需要显式指定ComponentScan({com.longjitech,com.longji})7. exclude 排除SpringBootApplication(exclude{FreeMarkerAutoConfiguration.class})即使 classpath 满足条件也明确不让该自动配置类生效。常见原因不需要该功能、与已有配置冲突、启动报错。也可以通过配置文件排除spring:autoconfigure:exclude:-org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration8. 自动配置为什么不会越引越慢候选类 130 → Conditional 过滤 → 实际生效 30~40 个 没引 MongoDB → MongoAutoConfiguration 条件不满足跳过 没引 Kafka → KafkaAutoConfiguration 条件不满足跳过 没引的依赖对应的自动配置类只是被读到但不会真正注册 Bean面试回答模板Spring Boot 自动配置的核心是 EnableAutoConfiguration。 它通过 AutoConfigurationImportSelector 在启动时读取 classpath 下 spring.factories 中声明的自动配置类拿到 130 个候选类。 这些候选类不会全部生效而是通过 Conditional 系列条件注解过滤。 ConditionalOnClass 判断依赖是否存在 ConditionalOnProperty 判断配置项是否开启 ConditionalOnMissingBean 判断容器中是否已有用户自定义 Bean。 满足条件的自动配置类会注册基础设施 Bean 比如 DataSource、DispatcherServlet、TransactionManager 等。 如果用户自己定义了同类型 BeanConditionalOnMissingBean 会让用户配置优先于框架默认配置。 所以自动配置本质上是根据 classpath 依赖、配置文件和容器已有 Bean 有条件地注册默认 Bean。参考来源Day11-Spring 与 SpringBoot01_Raw【原始素材】/面试资料-B站博主/SpringBoot篇18题 - 飞书云文档.md