大家好,我是锋哥。今天分享关于【Java高频面试题:Springboot的自动配置原理?】面试题 。希望对大家有帮助;

Java高频面试题:Springboot的自动配置原理?
Spring Boot 的**自动配置(Auto-Configuration)**是其"开箱即用"的核心机制之一,它的目标是:根据项目中引入的依赖和当前环境,自动为你配置 Spring Bean,而无需手动 XML 或大量 Java 配置。
下面从原理层面帮你系统讲清楚。
一、自动配置是怎么启动的?
Spring Boot 的入口在启动类:
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
其中最关键的是这个注解:
@SpringBootApplication
它本质上是三个注解的组合:
@SpringBootConfiguration@ComponentScan@EnableAutoConfiguration⭐(核心)
二、自动配置的核心开关:@EnableAutoConfiguration
@EnableAutoConfiguration
它做了什么?
👉 开启自动配置机制,并导入一批"自动配置类"
底层通过:
@Import(AutoConfigurationImportSelector.class)
实现。
三、核心机制:AutoConfigurationImportSelector
这是自动配置的"调度中心"。
它主要做三件事:
1. 加载自动配置类名单
Spring Boot 会从配置文件中加载:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
(Spring Boot 3+)
或者旧版本:
META-INF/spring.factories
里面定义了大量自动配置类,例如:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
2. 过滤哪些配置生效
不是所有自动配置都会加载,而是会经过条件判断(重点!)
四、自动配置的核心机制:条件注解(Condition)
自动配置类上通常会带有大量条件注解,例如:
常见条件注解:
@ConditionalOnClass:类路径中存在某个类才生效@ConditionalOnMissingBean:容器中没有某个 Bean 才创建@ConditionalOnProperty:配置文件中存在某个配置才生效@ConditionalOnBean:容器中已有某个 Bean 才生效
举个例子(非常关键)
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource() {
return new HikariDataSource();
}
}
含义:
- 只有当 classpath 中存在
DataSource类 - 且容器中没有 DataSource Bean 👉 才会自动创建一个 DataSource
五、自动配置的执行流程总结
整体流程可以理解为:
SpringApplication.run()
↓
@EnableAutoConfiguration
↓
AutoConfigurationImportSelector
↓
读取 AutoConfiguration.imports
↓
加载一堆自动配置类
↓
每个配置类进行 @Conditional 判断
↓
满足条件 → 注册 Bean 到 Spring 容器
↓
完成自动装配
六、为什么"引入依赖就能自动配置"?
关键在于:
👉 classpath + 条件注解
例如你引入:
spring-boot-starter-web
会自动带来:
- Tomcat
- Spring MVC
- Jackson
于是:
- classpath 中存在相关类 ✔
- 条件成立 ✔
- 自动配置生效 ✔
👉 最终自动帮你配置:
- DispatcherServlet
- Jackson HttpMessageConverter
- 内嵌 Tomcat
- Spring MVC 组件
七、自动配置 vs 手动配置
| 方式 | 特点 |
|---|---|
| 手动配置 | 需要自己定义 Bean |
| 自动配置 | Spring Boot 根据条件自动创建 |
但本质是:
👉 自动配置 = 帮你写了一堆"默认配置类"
八、如何排查自动配置?
可以通过以下方式查看哪些自动配置生效:
1. 开启 debug 日志
debug=true
控制台会输出:
Positive matches
Negative matches
告诉你:
- 哪些自动配置生效
- 哪些没有生效
- 为什么没生效
2. Actuator(如果引入)
访问:
/actuator/conditions
可以查看条件匹配情况
九、如何自定义或覆盖自动配置?
Spring Boot 的原则是:
👉 用户配置优先于自动配置
如果你自己定义了 Bean:
@Bean
public DataSource dataSource() {
return new DruidDataSource();
}
那么:
👉 自动配置中的 @ConditionalOnMissingBean 会失效
👉 Spring Boot 就不会再创建默认 DataSource
十、一句话总结
Spring Boot 自动配置的本质是:
通过 @EnableAutoConfiguration + 条件注解 + 配置类加载机制,根据 classpath 和环境自动为容器注册 Bean,从而实现"约定优于配置"。