乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 Spring Boot 概述

    • 章节导读:Spring Boot概述与核心理念
    • Spring Boot是什么
    • Spring Boot与Spring Framework的关系
    • 约定优于配置
  • 第2章 快速入门与第一个应用

    • 章节导读:快速入门与第一个应用
    • SpringApplication
    • 第一个Spring Boot应用
  • 第3章 起步依赖与版本管理

    • 章节导读:起步依赖与版本管理
    • 起步依赖
    • BOM版本管理
  • 第4章 自动配置原理

    • 章节导读:自动配置原理
    • 自动配置原理
    • AutoConfigurationImportSelector
    • 自动配置报告
  • 第5章 核心注解

    • 章节导读:核心注解
    • @SpringBootApplication
    • @EnableAutoConfiguration
    • @ConditionalOnClass
    • @ConditionalOnMissingBean
    • @ConditionalOnBean
    • @ConditionalOnProperty
  • 第6章 外部化配置与属性绑定

    • 章节导读:外部化配置与属性绑定
    • 外部化配置
    • @ConfigurationProperties
    • @Value
    • 配置属性优先级
  • 第7章 Profile 与环境切换

    • 章节导读:Profile与环境切换
    • @Profile
    • 多环境配置文件
  • 第8章 内嵌服务器与部署

    • 章节导读:内嵌服务器与部署
    • 内嵌服务器
    • Fat Jar
  • 第9章 Actuator 与监控

    • 章节导读:Actuator与监控
    • Actuator Health
    • Actuator Info
    • Actuator Metrics
    • 自定义Endpoint
    • 自定义HealthIndicator
  • 第10章 开发工具与最佳实践

    • 章节导读:开发工具与最佳实践
    • Banner自定义
    • 热部署

一句话定位:Starter 是 Spring Boot 的依赖套餐(Dependency Descriptor)——引入一个 Starter(如 spring-boot-starter-web),即可获得该功能领域所需的全套兼容依赖,无需手动挑选和逐个引入。


定义与作用

Starter 是一组预定义的 Maven 依赖描述符,它将某个功能领域(如 Web 开发、数据访问、安全认证)所需的所有 JAR 打包成一个统一的入口。开发者只需在 pom.xml 中引入一个 Starter,Maven 的传递依赖机制会自动拉取该 Starter 声明的所有依赖。

它解决的痛点:

传统 Maven 项目引入 Starter 后
手动引入 spring-webmvc、jackson-databind、hibernate-validator、tomcat-embed-core,逐个对齐版本引入 spring-boot-starter-web 一个依赖,自动获得上述全部
版本冲突时逐个排查 spring-webmvc 依赖哪个 jacksonBOM 已锁定兼容版本,传递依赖自动解析
新成员加入项目时问:"这个项目需要哪些依赖?"看 pom.xml 中的 Starter 列表即可,语义清晰
升级 Spring 版本时,逐个修改 spring-webmvc、spring-jdbc 等版本号升级 spring-boot-starter-parent 的版本号即可,所有 Starter 同步升级

适用位置与常用属性

Starter 是Maven 依赖,出现在 pom.xml 的 <dependencies> 节点中,无需写 version(由父 POM 的 BOM 锁定)。

常用 Starter 列表(飞翔科技常用)

Starter包含的核心依赖场景自动配置效果
spring-boot-starterSpring Boot 核心 + 自动配置 + 日志(logback + SLF4J)所有 Starter 的基座提供日志和基本基础设施
spring-boot-starter-webSpring MVC + Tomcat + Jackson + Validation传统 Web 应用自动启动 Tomcat、注册 DispatcherServlet、配置 Jackson
spring-boot-starter-webfluxSpring WebFlux + Reactor Netty响应式 Web 应用自动启动 Netty、配置 RouterFunction
spring-boot-starter-data-jpaHibernate + Spring Data JPA + HikariCPJPA 数据访问自动创建 EntityManagerFactory、JpaTransactionManager
spring-boot-starter-jdbcJdbcTemplate + HikariCPJDBC 数据访问自动创建 DataSource、JdbcTemplate
spring-boot-starter-data-redisLettuce + Spring Data RedisRedis 缓存自动创建 RedisConnectionFactory、StringRedisTemplate
spring-boot-starter-securitySpring Security安全认证授权自动创建安全过滤器链,默认保护所有端点
spring-boot-starter-testJUnit 5 + Mockito + AssertJ + Hamcrest单元/集成测试提供 @SpringBootTest 和测试切片
spring-boot-starter-actuatorActuator + Micrometer运维监控自动暴露 /actuator/health、/actuator/metrics 等端点
spring-boot-starter-validationHibernate ValidatorBean 校验自动配置 LocalValidatorFactoryBean
spring-boot-starter-mailJavaMail + Spring Mail邮件发送自动创建 JavaMailSender
spring-boot-starter-thymeleafThymeleaf 模板引擎服务端渲染自动配置 Thymeleaf 视图解析器

命名规范

命名模式说明示例
spring-boot-starter-*官方 Starter,由 Spring 团队维护spring-boot-starter-web
spring-boot-starter核心 Starter,无后缀,所有官方 Starter 的基座spring-boot-starter
*-spring-boot-starter第三方 Starter,由社区或公司维护mybatis-spring-boot-starter

核心原理

Starter 的依赖传递机制

层级解读:

  1. 本项目:小崔在 pom.xml 中只写了 spring-boot-starter-web 和 spring-boot-starter-jdbc 两个依赖,都没有 <version>。
  2. Starter 层:spring-boot-starter-web 是一个空 JAR(或极简 JAR),自身几乎无代码,它的作用是声明一组传递依赖——spring-webmvc、jackson-databind、hibernate-validator、spring-boot-starter-tomcat 等。
  3. 核心库层:spring-boot-starter-tomcat 进一步传递依赖 tomcat-embed-core 和 tomcat-embed-websocket。
  4. 版本来源:所有这些版本都不是小崔写的,而是由 spring-boot-dependencies BOM 锁定(详见下一篇「BOM 版本管理」)。

引入 Starter 前后依赖数量对比


完整示例

场景说明

飞翔科技的学生成绩管理系统需要 Web 接口、JDBC 数据访问和运维监控。小崔对比了"手动引入依赖"和"使用 Starter"两种方案。

操作前:手动引入所有依赖(无 Starter)

<dependencies>
    <!-- 手动引入 Spring MVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.27</version>
    </dependency>
    <!-- 手动引入 Jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.5</version>
    </dependency>
    <!-- 手动引入 Tomcat -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <version>9.0.75</version>
    </dependency>
    <!-- 手动引入 JdbcTemplate -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.27</version>
    </dependency>
    <!-- 手动引入连接池 -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>4.0.3</version>
    </dependency>
    <!-- 手动引入事务 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>5.3.27</version>
    </dependency>
    <!-- 手动引入 MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!-- 手动引入 Actuator -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
        <version>2.7.18</version>
    </dependency>
</dependencies>

问题:

  • 8 个依赖,8 个版本号,任何一个升级都需要检查与其他依赖的兼容性。
  • 新成员不知道 spring-webmvc 和 jackson-databind 的版本是否匹配,容易引入冲突。
  • 缺少 spring-webmvc 的传递依赖(如 spring-core、spring-context),需要进一步手动补齐。

使用 Starter 的完整代码

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.18</version>
    </parent>

    <groupId>com.feixiang</groupId>
    <artifactId>student-management</artifactId>
    <version>1.0.0</version>

    <dependencies>
        <!-- Web 开发:Spring MVC + Tomcat + Jackson + Validation -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- JDBC 数据访问:JdbcTemplate + HikariCP + Transaction -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!-- MySQL 驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- 运维监控:Actuator + Micrometer -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- 测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

传递依赖验证:

执行 mvn dependency:tree 查看实际解析的依赖树(节选):

com.feixiang:student-management:jar:1.0.0
+- org.springframework.boot:spring-boot-starter-web:jar:2.7.18:compile
|  +- org.springframework.boot:spring-boot-starter:jar:2.7.18:compile
|  |  +- org.springframework.boot:spring-boot:jar:2.7.18:compile
|  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:2.7.18:compile
|  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.7.18:compile
|  |  |  +- ch.qos.logback:logback-classic:jar:1.2.12:compile
|  |  +- org.springframework:spring-core:jar:5.3.27:compile
|  +- org.springframework.boot:spring-boot-starter-json:jar:2.7.18:compile
|  |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.13.5:compile
|  |  +- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.13.5:compile
|  +- org.springframework.boot:spring-boot-starter-tomcat:jar:2.7.18:compile
|  |  +- org.apache.tomcat.embed:tomcat-embed-core:jar:9.0.75:compile
|  |  +- org.apache.tomcat.embed:tomcat-embed-websocket:jar:9.0.75:compile
|  +- org.springframework:spring-webmvc:jar:5.3.27:compile
|  |  +- org.springframework:spring-aop:jar:5.3.27:compile
|  |  +- org.springframework:spring-beans:jar:5.3.27:compile
|  |  +- org.springframework:spring-context:jar:5.3.27:compile
|  |  +- org.springframework:spring-expression:jar:5.3.27:compile
|  +- org.springframework:spring-web:jar:5.3.27:compile
+- org.springframework.boot:spring-boot-starter-jdbc:jar:2.7.18:compile
|  +- com.zaxxer:HikariCP:jar:4.0.3:compile
|  +- org.springframework:spring-jdbc:jar:5.3.27:compile
|  |  +- org.springframework:spring-tx:jar:5.3.27:compile
+- mysql:mysql-connector-java:jar:8.0.33:runtime
+- org.springframework.boot:spring-boot-starter-actuator:jar:2.7.18:compile
   +- io.micrometer:micrometer-core:jar:1.9.12:compile

操作后运行结果及分析

分析:

  1. 依赖数量:pom.xml 中只写了 5 个依赖,mvn dependency:tree 实际解析出 30+ 个传递依赖,包括 spring-core、spring-context、logback、jackson-core、tomcat-embed-websocket 等,全部由 Starter 自动带入。
  2. 版本一致性:所有 org.springframework 依赖都是 5.3.27,所有 jackson 依赖都是 2.13.5,所有 tomcat 依赖都是 9.0.75,版本完全对齐,无冲突。
  3. 自动配置触发:spring-boot-starter-web 带入了 spring-boot-autoconfigure,这是自动配置的引擎;spring-boot-starter-actuator 带入了 micrometer-core,这是指标采集的基础。
  4. 语义清晰:新人看 pom.xml,只看到 web、jdbc、actuator 等功能名称,无需关心底层库的具体坐标和版本。

白歌评价:"Starter 把'技术选型'变成了'功能点餐'。小崔不需要知道 jackson-databind 的版本,他只需要说'我要 Web 功能'。"


易错场景与面试考点

易错场景:在 Starter 中手动写 version,导致版本冲突

小崔曾在一个已有 Spring Boot 的项目中,因为习惯使然,给某个依赖手动加了版本号。

错误示范:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.0</version>  <!-- ← 错误:手动覆盖版本,与父POM 2.7.18 冲突 -->
</dependency>

后果:

  • 父 POM 锁定的是 2.7.18 的 Spring Boot 生态(Spring 5.3.27、Jackson 2.13.5)。
  • 手动指定 2.6.0 后,该 Starter 内部依赖的 Spring MVC 可能变成 5.3.18,而其他 Starter(如 spring-boot-starter-jdbc)仍由父 POM 锁定在 Spring 5.3.27。
  • 结果:运行时出现 NoSuchMethodError 或 ClassNotFoundException,因为 Spring 5.3.18 和 5.3.27 的某些内部类签名不同。

正确做法:信任父 POM 和 BOM,不在 Starter 上写 version。如果确实需要升级 Spring Boot 版本,统一修改父 POM 的 <version>:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.18</version>
</parent>

面试考点

Q:Starter 的本质是什么?它里面有没有代码?

Starter 的本质是依赖描述符(Dependency Descriptor),通常是一个空 JAR 或只包含 META-INF/spring.provides 的极简 JAR。它的核心作用是声明一组传递依赖,让开发者通过"引入一个依赖"获得"全套功能"。真正的代码在 Starter 传递依赖的底层库中(如 spring-webmvc、jackson-databind)。

Q:自定义 Starter 需要遵循哪些命名规范?

官方 Starter 命名:spring-boot-starter-*(如 spring-boot-starter-web)。第三方 Starter 命名:*-spring-boot-starter(如 mybatis-spring-boot-starter),避免与官方命名空间冲突。自定义 Starter 需要创建 META-INF/spring.factories 文件注册自动配置类。

Q:如何查看一个 Starter 具体引入了哪些依赖?

执行 mvn dependency:tree 查看完整的依赖树。或者打开本地 Maven 仓库中该 Starter 的 POM 文件(如 ~/.m2/repository/org/springframework/boot/spring-boot-starter-web/2.7.18/spring-boot-starter-web-2.7.18.pom),阅读其 <dependencies> 节点。

Q:如果只想用 Spring Boot 的版本管理,但不想继承 spring-boot-starter-parent(比如公司已有自己的父POM),怎么办?

可以使用 <dependencyManagement> 导入 spring-boot-dependencies BOM,而非继承父 POM:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.7.18</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

这样可以在不继承 spring-boot-starter-parent 的情况下,获得 BOM 的版本锁定能力。但会丢失父 POM 提供的插件配置(如 spring-boot-maven-plugin 的默认绑定),需要手动配置。

上一页
章节导读:起步依赖与版本管理
下一页
BOM版本管理