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

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

相关推荐
WeiXin_DZbishe2 小时前
基于springboot宠物领养系统-计算机毕设 附源码【课程设计】94217
vue.js·spring boot·python·django·php·课程设计
架构技术专栏3 小时前
Agent 工具调用:从工具声明到执行反馈
前端·人工智能·后端
vx_bisheyuange3 小时前
基于SpringBoot的体育商品推荐系统
spring boot·毕业设计
别动我齐刘海3 小时前
C++ 工程化学习
java·linux·前端·c++·学习·机器学习·机器人
码事漫谈3 小时前
你让AI干的活,它可能只干了十分之一——而你根本看不出来
后端
Wx-bishekaifayuan4 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
人工智能·spring boot·后端·python·课程设计·express·旅游
Wx-bishekaifayuan4 小时前
springboot汉中旅游服务平台41442-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
code2cat5 小时前
Java进阶篇之AtomicLongFieldUpdater:把累计额度留在对象字段中
java·cas·并发编程
WeiXin_DZbishe5 小时前
基于springboot城市公交实时运营与调度系统-计算机毕设 附源码【课程设计】66173
java·vue.js·spring boot·后端·python·php·课程设计
泡茶喝茶写代码5 小时前
A股量化数据工程:从 REST 接口到策略信号(第 18 篇):放量缩量异动扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口