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 注册进容器。

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

相关推荐
Xiacqi11 小时前
Java数据库连接--JDBC--DRUID
数据库·后端
浮游本尊1 小时前
用结构化 Prompt 让大模型「干活」:以数据库巡检告警建议生成为例
后端
snakeshe10101 小时前
SpringBoot 多人协作平台实战(8):Cookie 与登录状态维持
后端
代码北人生1 小时前
后端工程师开始用 Claude Code 了,Stripe 4天完成了本来要10个工程师周的迁移
后端·claude
Klong.k2 小时前
如何避免Bean的线程安全问题
java·开发语言
basketball6162 小时前
C++ 单例模式完全指南:从饿汉式到现代 C++ 的最佳实践
java·c++·单例模式
iiiiyu2 小时前
集合进阶(Map集合)
java·大数据·开发语言·数据结构·编程语言
小江的记录本2 小时前
【Java基础】核心关键字:final、static、volatile、synchronized、transient(附《思维导图》+《面试高频考点清单》)
java·前端·数据结构·后端·ai·面试·ai编程