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

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

相关推荐
葫芦和十三2 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp2 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑3 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯4 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan6 小时前
多Agent之间的区别
后端
青石路8 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充8 小时前
1.面向对象设计思想
后端
IT_陈寒8 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro9 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗9 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端