每日一道面试题 08:SpringBoot 自动配置原理

张开发
2026/4/11 12:39:07 15 分钟阅读

分享文章

每日一道面试题 08:SpringBoot 自动配置原理
一、核心前提SpringBoot 核心优势自动配置无需手动编写大量 XML 配置简化开发本质是 “约定优于配置”自动配置底层依赖EnableAutoConfiguration注解 Spring 工厂加载机制 条件注解核心目标理解 “为什么引入依赖就能自动生效”而非死记硬背结论大厂面试重点考察源码理解二、自动配置原理3 步拆解源码级讲解第一步触发自动配置入口注解SpringBoot 启动类的SpringBootApplication是核心它是一个复合注解其中EnableAutoConfiguration是自动配置的入口。// SpringBootApplication 本质简化源码 Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Import(AutoConfigurationImportSelector.class) // 核心导入自动配置选择器 public interface EnableAutoConfiguration { String[] exclude() default {}; // 排除指定自动配置类 }第二步加载自动配置类核心逻辑AutoConfigurationImportSelector类的selectImports方法会加载classpath 下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件该文件中存储了所有自动配置类的全路径如DataSourceAutoConfiguration、WebMvcAutoConfiguration。// AutoConfigurationImportSelector 核心方法 public String[] selectImports(AnnotationMetadata metadata) { // 1. 加载 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件 ListString configurations getCandidateConfigurations(metadata, attributes); // 2. 去重、排除用户指定的 exclude 类 configurations removeDuplicates(configurations); SetString exclusions getExclusions(metadata, attributes); configurations.removeAll(exclusions); // 3. 返回最终要加载的自动配置类 return StringUtils.toStringArray(configurations); }第三步条件生效按需加载所有自动配置类都带有条件注解只有满足条件才会生效避免无用配置加载核心条件注解ConditionalOnClass类路径下存在指定类才生效如DataSourceAutoConfiguration依赖DataSource类ConditionalOnMissingBean容器中不存在指定 Bean才生效避免重复配置ConditionalOnProperty配置文件中存在指定配置才生效如spring.datasource.enabledtrueConfiguration ConditionalOnClass(DataSource.class) // 存在 DataSource 类才生效 ConditionalOnMissingBean(DataSource.class) // 容器中没有 DataSource 才生效 EnableConfigurationProperties(DataSourceProperties.class) // 绑定配置文件参数 public class DataSourceAutoConfiguration { // 绑定 application.yml 中的 spring.datasource 配置 Autowired private DataSourceProperties properties; // 自动创建 DataSource Bean无需手动配置 Bean public DataSource dataSource() { return createDataSource(properties); } }三、面试高频追问追问 1SpringBootApplication 和 EnableAutoConfiguration 的关系答SpringBootApplication包含EnableAutoConfiguration是自动配置的入口补充单独使用EnableAutoConfiguration也能触发自动配置但SpringBootApplication还整合了ComponentScan扫描当前包及子包、Configuration标识配置类是更完整的启动注解。追问 2如何排除某个自动配置类实战必备启动类注解排除局部排除SpringBootApplication(exclude DataSourceAutoConfiguration.class) public class Application { ... }配置文件排除全局排除spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration追问 3为什么引入 spring-boot-starter-web 就能自动配置 SpringMVC因为spring-boot-starter-web依赖中包含了spring-web、spring-webmvc相关类自动配置类WebMvcAutoConfiguration会被AutoConfigurationImportSelector加载且满足ConditionalOnClass(WebMvcConfigurer.class)条件因此自动生效无需手动配置视图解析器、DispatcherServlet 等。追问 4自动配置和手动配置的优先级手动配置 自动配置若手动创建了DataSourceBeanConditionalOnMissingBean(DataSource.class)条件不满足DataSourceAutoConfiguration会自动失效优先使用手动配置。四、总结SpringBoot 自动配置的核心是通过 EnableAutoConfiguration 导入自动配置选择器加载 META-INF 下的自动配置类结合条件注解按需生效最终实现 “引入依赖即配置”简化开发的同时保证灵活性。

更多文章