Spring Boot 自动配置原理与常用注解

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 自动配置链路:

  1. 启动类上有 @SpringBootApplication
  2. 其中 @EnableAutoConfiguration 负责开启自动配置。
  3. @EnableAutoConfiguration 内部通过 @Import 导入自动配置选择器。
  4. 自动配置选择器读取依赖包中的 META-INF/spring.factories
  5. 文件里记录了一批自动配置类的全限定名。
  6. Spring Boot 加载这些配置类。
  7. 配置类上的条件注解进行判断。
  8. 条件满足时,把配置类里的 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 通常做两件事:

  1. 帮你聚合依赖。
  2. 带上对应的自动配置类。

比如引入 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 注册进容器。

把这条线讲清楚,比背一堆注解名更有价值。

相关推荐
JustHappy9 小时前
古法编程秘籍(六):程序到底是怎么跑起来的?从 IO 到中断,一次讲明白
前端·后端·全栈
晨曦中的暮雨10 小时前
Golang速通(Javaer版)
java·开发语言·后端·golang
七老板的blog10 小时前
当 Spring StateMachine 遇见大模型:构建工业级 AI 写作流水线
java·人工智能·spring
云烟成雨TD10 小时前
Spring AI 1.x 系列【46】MCP Security 模块
java·人工智能·spring
CRMEB系统商城10 小时前
CRMEB多商户系统(Java)v2.3公测版发布
java·开发语言·人工智能·小程序·开源·php
sinat_2554878110 小时前
第七部分。介绍MVC(模型-视图-控制器)模式
java·ide·http·tomcat·intellij-idea
李白的天不白11 小时前
ps -ef | grep java
java
ab_dg_dp11 小时前
Android 17+ 提取 AIDL 生成 Java 文件的实用脚本
android·java·python
超哥--11 小时前
B站视频内容智能分析系统(三):B站视频自动采集
java·开发语言·音视频·ai编程
小村儿11 小时前
连载13- 内部Tools,Claude Code 怎么真正"动"你的代码
前端·后端·ai编程