Spring Boot 面试最常问的问题是:为什么引入一个 starter,再写少量配置,项目就能跑起来?答案就在自动配置。
一句话概括:Spring Boot 通过 @SpringBootApplication 启动组件扫描和自动配置,再根据 classpath、配置属性、已有 Bean 等条件,把合适的配置类和 Bean 加进 Spring 容器。

满足
不满足
SpringBootApplication
SpringBootConfiguration
ComponentScan
EnableAutoConfiguration
通过 Import
导入配置选择器
读取自动配置类清单
加载自动配置类
条件注解
是否满足
注册默认 Bean
跳过该配置
@SpringBootApplication 包了什么
Spring Boot 启动类通常长这样:
java
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
@SpringBootApplication 不是一个单一能力,它组合了三个关键注解:
| 注解 | 作用 |
|---|---|
@SpringBootConfiguration |
表示当前类也是一个配置类,本质上和 @Configuration 类似 |
@ComponentScan |
扫描启动类所在包及其子包下的组件 |
@EnableAutoConfiguration |
开启自动配置,是 Spring Boot 自动装配的核心 |
这也是为什么启动类通常要放在项目根包下:默认组件扫描会从启动类所在包开始往下扫。
自动配置大概怎么生效
课程材料里讲的是典型 Spring Boot 2.x 自动配置链路:
- 启动类上有
@SpringBootApplication。 - 其中
@EnableAutoConfiguration负责开启自动配置。 @EnableAutoConfiguration内部通过@Import导入自动配置选择器。- 自动配置选择器读取依赖包中的
META-INF/spring.factories。 - 文件里记录了一批自动配置类的全限定名。
- Spring Boot 加载这些配置类。
- 配置类上的条件注解进行判断。
- 条件满足时,把配置类里的 Bean 放入 Spring 容器。
自动配置不是"无脑全加载",而是有条件地加载。
条件注解怎么理解
自动配置类里常见这样的条件判断:
java
@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
public DataSource dataSource() {
return new HikariDataSource();
}
}
可以这样理解:
| 条件注解 | 含义 |
|---|---|
@ConditionalOnClass |
classpath 下存在某个类时才生效 |
@ConditionalOnMissingBean |
容器中没有某个 Bean 时才创建默认 Bean |
@ConditionalOnBean |
容器中存在某个 Bean 时才生效 |
@ConditionalOnProperty |
配置文件中某个属性满足条件时才生效 |
这就是 Spring Boot 的聪明之处:你引入了相关依赖,它才有机会配置;你自己定义了 Bean,它就尊重你的配置。
starter 和自动配置的关系
starter 通常做两件事:
- 帮你聚合依赖。
- 带上对应的自动配置类。
比如引入 Web starter 后,项目里会有 SpringMVC、内嵌 Tomcat、JSON 转换等相关依赖。Spring Boot 检测到 classpath 中有这些类,就会启用相关自动配置。
所以 starter 不是魔法,它本质上是"依赖 + 自动配置"的组合。
常用注解地图

Spring 常用注解
组件注册
依赖注入
AOP 切面
SpringMVC 常用注解
请求映射
参数绑定
响应 JSON
Spring Boot
常用注解
启动配置
自动装配
条件装配
Spring 常用注解
| 注解 | 作用 |
|---|---|
@Component |
声明普通组件 |
@Controller |
声明 Web 控制器 |
@Service |
声明业务层组件 |
@Repository |
声明持久层组件 |
@Autowired |
按类型依赖注入 |
@Qualifier |
配合 @Autowired 按名称注入 |
@Scope |
指定 Bean 作用域 |
@Configuration |
声明配置类 |
@ComponentScan |
指定组件扫描范围 |
@Bean |
把方法返回值注册到容器 |
@Import |
导入其他配置或组件 |
SpringMVC 常用注解
| 注解 | 作用 |
|---|---|
@RequestMapping |
映射请求路径 |
@RequestBody |
接收请求体 JSON |
@RequestParam |
获取请求参数 |
@PathVariable |
获取路径变量 |
@ResponseBody |
返回对象写入响应体 |
@RequestHeader |
获取请求头 |
@RestController |
@Controller + @ResponseBody |
Spring Boot 常用注解
| 注解 | 作用 |
|---|---|
@SpringBootConfiguration |
声明 Spring Boot 配置类 |
@EnableAutoConfiguration |
开启自动配置 |
@SpringBootApplication |
启动类组合注解 |
面试回答模板
可以这样回答:
Spring Boot 自动配置的核心是
@SpringBootApplication,它组合了@SpringBootConfiguration、@ComponentScan和@EnableAutoConfiguration。其中@EnableAutoConfiguration会通过@Import导入自动配置选择器,读取依赖包下的自动配置类信息,然后根据条件注解判断是否加载对应配置类。比如@ConditionalOnClass判断 classpath 下是否存在某个类,@ConditionalOnMissingBean判断容器中是否已经有用户自定义 Bean。条件满足时,自动配置类中的 Bean 会被注册到 Spring 容器中。
小结
Spring Boot 自动配置的本质不是"自动猜",而是:
starter 提供依赖和配置类 -> 自动配置选择器找到配置类 -> 条件注解决定是否生效 -> Bean 注册进容器。
把这条线讲清楚,比背一堆注解名更有价值。