Spring Boot Starter 原理

候选人小毛在面试快手 P6 时,面试官问道:

"你用过哪些 Spring Boot Starter?"

小毛说:"spring-boot-starter-web、spring-boot-starter-data-redis..."

面试官追问:"Spring Boot Starter 是怎么工作的?"

小毛说:"它会自动配置很多东西..."

面试官:"那 spring-boot-starter 和 spring-boot-autoconfigure 有什么区别?"

小毛答不上来。

【面试官心理】 这道题我用来测试候选人对 Spring Boot Starter 生态的理解。知道怎么用 Starter 的人很多,但知道 Starter 怎么工作的人很少。能说出两个依赖的区别、能自己实现 Starter 的,是 P7 级别的候选人。


一、核心问题 🔴

1.1 问题拆解

第一层:概念

  • "Spring Boot Starter 是什么?"
  • "spring-boot-starter 和 spring-boot-autoconfigure 有什么区别?"

第二层:结构

  • "一个 Starter 的标准结构是什么?"
  • "autoconfigure 模块和 starter 模块是什么关系?"

第三层:原理

  • "Starter 是怎么触发自动配置的?"
  • "为什么添加依赖就能生效?"

1.2 标准回答

P5 回答:两个依赖的区别

模块作用是否必须
spring-boot-starter-*传递依赖,包含 autoconfigure 模块 + 其他依赖用户引入
spring-boot-autoconfigure-*自动配置代码,定义 @Configuration 类自动引入

1.3 追问升级

追问 1:Spring Boot Web Starter 的依赖结构

spring-boot-starter-web
  ├─ spring-boot-starter
  │   └─ spring-boot-autoconfigure
  │       └─ spring-boot
  ├─ spring-boot-starter-tomcat
  ├─ spring-web
  └─ spring-webmvc

spring-boot-starter-data-redis
  ├─ spring-boot-starter
  │   └─ spring-boot-autoconfigure
  │       └─ spring-boot
  ├─ spring-data-redis
  └─ lettuce-core

追问 2:自定义 Starter 的标准结构

my-starter/
├── my-autoconfigure/
│   ├── src/main/java/
│   │   └── com/example/autoconfigure/
│   │       ├── MyAutoConfiguration.java    ← 自动配置类
│   │       └── MyProperties.java          ← 配置属性类
│   └── src/main/resources/
│       └── META-INF/
│           └── spring/
│               └── org.springframework.boot.autoconfigure.AutoConfiguration.imports
│                   ← Spring Boot 2.7+ 的配置文件
└── my-spring-boot-starter/
    ├── pom.xml
    └── src/main/resources/
        └── META-INF/
            └── spring.schemas

二、面试总结

Spring Boot Starter 的核心价值是"零配置"——用户只需要添加依赖,框架自动完成配置。