1-3 起步依赖(Starter)
概念解析
什么是起步依赖?
起步依赖(Starter)是 Spring Boot 提供的依赖聚合机制,通过一个 jar 包引入所有相关依赖,简化版本管理。
官方 starter 命名规范
| 命名格式 | 说明 | 示例 |
|---|---|---|
spring-boot-starter-* | 官方 starter | spring-boot-starter-web |
spring-boot-starter-* | 官方 starter | spring-boot-starter-data-jpa |
*-spring-boot-starter | 第三方 starter | mybatis-spring-boot-starter |
常见官方 starter
| Starter | 引入的依赖 |
|---|---|
| spring-boot-starter-web | SpringMVC, Tomcat, JSON |
| spring-boot-starter-data-jpa | Hibernate, Spring Data JPA |
| spring-boot-starter-data-redis | Jedis/Lettuce, Spring Data Redis |
| spring-boot-starter-validation | Hibernate Validator |
| spring-boot-starter-actuator | 健康检查、监控端点 |
| spring-boot-starter-test | JUnit, Mockito, Spring Test |
代码示例
1. Web 开发起步依赖
<!-- 一行代码引入所有 Web 相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
引入的传递依赖:
spring-boot-starter-web
├── spring-boot-starter
│ ├── spring-boot
│ ├── spring-boot-autoconfigure
│ └── spring-core, spring-jcl
├── spring-boot-starter-tomcat
│ ├── tomcat-embed-core
│ └── tomcat-embed-el
└── spring-webmvc
└── spring-web
2. 依赖版本管理
起步依赖的版本由 spring-boot-starter-parent 统一管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
父 pom 定义的常用版本属性:
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>3.2.0</spring-boot.version>
<mysql.version>8.0.33</mysql.version>
<mybatis-spring-boot.version>3.0.3</mybatis-spring-boot.version>
</properties>
3. 覆盖默认版本
<properties>
<!-- 覆盖父 pom 中的版本 -->
<mysql.version>8.1.0</mysql.version>
</properties>
<!-- 或在依赖中直接指定 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
4. 可选依赖(Optional)
某些依赖在特定场景下才需要:
<!-- 如果不需要内嵌 Tomcat,可以排除 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用 Undertow 替代 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
常见坑点
⚠️ 坑 1:依赖冲突
问题:引入多个 starter 后出现类找不到
排查命令:
# 查看依赖树
mvn dependency:tree
# 过滤查看特定依赖
mvn dependency:tree -Dincludes=*:spring-web
解决:使用 exclusion 排除冲突依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
⚠️ 坑 2:starter 未生效
问题:引入 starter 后自动配置没生效
检查项:
- 是否正确引入依赖(groupId、artifactId)
- 是否有条件注解导致不生效
- 查看自动配置报告
⚠️ 坑 3:Spring Boot 2.x 与 3.x 差异
| 项目 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| Java 版本 | 8+ | 17+ |
| Jakarta EE | Java EE 8 | Jakarta EE 9+ |
| MyBatis | mybatis-spring-boot-starter | mybatis-spring-boot-starter |
| 注解包名 | javax.* | jakarta.* |
面试题
Q1:起步依赖解决了什么问题?
参考答案:
- 依赖简化:一个 starter 代替多个 jar 依赖
- 版本统一:父 pom 统一管理版本,避免冲突
- 按需引入:根据场景选择需要的 starter
- 智能配置:引入 starter 后自动配置相关 Bean
Q2:spring-boot-starter-parent 做了什么?
参考答案:
- 依赖管理:定义了常用依赖的默认版本
- 插件管理:配置了 maven 编译、打包插件
- 资源过滤:配置了资源文件的过滤规则
- JDK 版本:默认使用 Java 17
- UTF-8 编码:统一项目编码为 UTF-8
Q3:如何自定义起步依赖?
参考答案:
分为两个模块:
autoconfigure 模块:
- 包含
@Configuration配置类 - 定义
@Conditional条件 - 注册到
spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
starter 模块:
- 仅包含依赖引用
- 零配置代码
<!-- my-starter/pom.xml -->
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>my-starter-autoconfigure</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 可选:添加使用方需要的 API 依赖 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
</dependencies>