1-3 起步依赖(Starter)

4 阅读3分钟

1-3 起步依赖(Starter)

概念解析

什么是起步依赖?

起步依赖(Starter)是 Spring Boot 提供的依赖聚合机制,通过一个 jar 包引入所有相关依赖,简化版本管理。

官方 starter 命名规范

命名格式说明示例
spring-boot-starter-*官方 starterspring-boot-starter-web
spring-boot-starter-*官方 starterspring-boot-starter-data-jpa
*-spring-boot-starter第三方 startermybatis-spring-boot-starter

常见官方 starter

Starter引入的依赖
spring-boot-starter-webSpringMVC, Tomcat, JSON
spring-boot-starter-data-jpaHibernate, Spring Data JPA
spring-boot-starter-data-redisJedis/Lettuce, Spring Data Redis
spring-boot-starter-validationHibernate Validator
spring-boot-starter-actuator健康检查、监控端点
spring-boot-starter-testJUnit, 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 后自动配置没生效

检查项

  1. 是否正确引入依赖(groupId、artifactId)
  2. 是否有条件注解导致不生效
  3. 查看自动配置报告

⚠️ 坑 3:Spring Boot 2.x 与 3.x 差异

项目Spring Boot 2.xSpring Boot 3.x
Java 版本8+17+
Jakarta EEJava EE 8Jakarta EE 9+
MyBatismybatis-spring-boot-startermybatis-spring-boot-starter
注解包名javax.*jakarta.*

面试题

Q1:起步依赖解决了什么问题?

参考答案

  1. 依赖简化:一个 starter 代替多个 jar 依赖
  2. 版本统一:父 pom 统一管理版本,避免冲突
  3. 按需引入:根据场景选择需要的 starter
  4. 智能配置:引入 starter 后自动配置相关 Bean

Q2:spring-boot-starter-parent 做了什么?

参考答案

  1. 依赖管理:定义了常用依赖的默认版本
  2. 插件管理:配置了 maven 编译、打包插件
  3. 资源过滤:配置了资源文件的过滤规则
  4. JDK 版本:默认使用 Java 17
  5. 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>