Skip to content

Starter 与起步依赖

一、Starter 是什么

Starter 是 Spring Boot 的核心概念,一站式引入某个功能所需的所有依赖。

传统方式:
┌─────────────────────────────────────────────────────────────────┐
│  手动添加依赖(容易遗漏、版本冲突)                                 │
├─────────────────────────────────────────────────────────────────┤
│  spring-web.jar (版本?)                                        │
│  spring-webmvc.jar (版本?)                                     │
│  jackson-databind.jar (版本?)                                   │
│  hibernate-validator.jar (版本?)                                │
│  tomcat-embed-*.jar (版本?)                                     │
│  ... 20+ 个 jar,手动管理版本头疼!                               │
└─────────────────────────────────────────────────────────────────┘

Starter 方式:
┌─────────────────────────────────────────────────────────────────┐
│  只需引入一个 starter                                            │
├─────────────────────────────────────────────────────────────────┤
│  spring-boot-starter-web → 自动引入所有相关依赖                  │
│                              + 版本自动仲裁                       │
└─────────────────────────────────────────────────────────────────┘

二、Starter 命名规范

官方 starter:     spring-boot-starter-xxx
第三方 starter:   xxx-spring-boot-starter

例子:
- spring-boot-starter-web      (官方)
- spring-boot-starter-data-redis (官方)
- mybatis-spring-boot-starter  (第三方)
- druid-spring-boot-starter   (第三方)

三、官方 Starter 分类

核心 Starter

Starter引入的依赖
spring-boot-starter核心功能(日志、YAML、Environment)
spring-boot-starter-actuator运维监控端点
spring-boot-starter-test单元测试

Web Starter

Starter引入的依赖
spring-boot-starter-webWeb 开发(Spring MVC + Tomcat)
spring-boot-starter-webflux响应式 Web(Reactor + Netty)
spring-boot-starter-websocketWebSocket
spring-boot-starter-web-servicesWeb Services

数据 Starter

Starter引入的依赖
spring-boot-starter-data-jpaSpring Data JPA + Hibernate
spring-boot-starter-data-mongodbMongoDB
spring-boot-starter-data-redisRedis + Lettuce
spring-boot-starter-data-elasticsearchElasticsearch
spring-boot-starter-jdbcJDBC + HikariCP
spring-boot-starter-data-cassandraCassandra

安全 Starter

Starter引入的依赖
spring-boot-starter-securitySpring Security
spring-boot-starter-oauth2-resource-serverOAuth2 资源服务器
spring-boot-starter-oauth2-clientOAuth2 客户端

其他 Starter

Starter引入的依赖
spring-boot-starter-validationHibernate Validator
spring-boot-starter-cacheSpring Cache
spring-boot-starter-mailJava Mail
spring-boot-starter-thymeleafThymeleaf 模板
spring-boot-starter-amqpRabbitMQ
spring-boot-starter kafkaKafka

四、spring-boot-starter-parent

pom.xml 配置

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

父 POM 的功能

xml
<!-- 1. 定义 Java 版本 -->
<properties>
    <java.version>17</java.version>
</properties>

<!-- 2. 依赖管理(定义版本,但不引入)-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>3.2.0</version>  <!-- 统一版本 -->
        </dependency>
        <!-- 其他 starter 版本也统一为 3.2.0 -->
    </dependencies>
</dependencyManagement>

<!-- 3. 插件管理 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>3.2.0</version>
        </plugin>
    </plugins>
</build>

<!-- 4. 默认资源过滤 -->
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

不使用 parent

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

五、spring-boot-starter-web 依赖树

bash
mvn dependency:tree -Dincludes=org.springframework.boot:spring-boot-starter-web
spring-boot-starter-web:3.2.0

├─ spring-boot-starter:3.2.0
│   └─ spring-boot-logging:3.2.0
│       ├─ logback-classic:1.4.11
│       │   ├─ logback-core:1.4.11
│       │   └─ slf4j-api:2.0.9
│       ├─ log4j-to-slf4j:2.20.0
│       │   └─ jul-to-slf4j:2.0.9
│       └─ jcl-over-slf4j:2.0.9

├─ spring-boot-starter-tomcat:3.2.0
│   ├─ tomcat-embed-core:10.1.16
│   ├─ tomcat-embed-el:10.1.16
│   └─ tomcat-embed-websocket:10.1.16

├─ spring-web:6.1.1
│   ├─ spring-beans:6.1.1
│   ├─ spring-context:6.1.1
│   └─ spring-web:6.1.1

└─ spring-webmvc:6.1.1
    ├─ spring-aop:6.1.1
    ├─ spring-beans:6.1.1
    ├─ spring-context:6.1.1
    ├─ spring-core:6.1.1
    └─ spring-expression:6.1.1

六、常用 Starter 详解

1. spring-boot-starter-web

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 自动引入 -->
<!-- Tomcat 内嵌容器 -->
<!-- Spring MVC -->
<!-- JSON 处理 (Jackson) -->
<!-- Validation -->

2. spring-boot-starter-data-jdbc

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

<!-- 自动引入 -->
<!-- spring-jdbc -->
<!-- hikari-cp (默认连接池) -->
<!-- spring-tx (事务) -->

3. spring-boot-starter-data-redis

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- 自动引入 -->
<!-- spring-data-redis -->
<!-- lettuce-core (Redis 客户端) -->
<!-- jackson-databind (序列化) -->

4. spring-boot-starter-security

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<!-- 自动引入 -->
<!-- spring-security-config -->
<!-- spring-security-core -->
<!-- spring-security-web -->

5. spring-boot-starter-actuator

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
yaml
# 暴露端点
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env
  endpoint:
    health:
      show-details: always

常用端点

  • /actuator/health - 健康检查
  • /actuator/info - 应用信息
  • /actuator/metrics - 指标
  • /actuator/env - 环境变量
  • /actuator/beans - 所有 Bean
  • /actuator/mappings - URL 映射

七、排除/替换依赖

排除依赖

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <!-- 排除 Tomcat,使用 Jetty -->
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 引入 Jetty -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

内嵌容器对比

容器特点内存占用适用场景
Tomcat默认通用
Jetty轻量响应式/长期运行
Undertow高性能高并发

替换数据源

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- 排除 HikariCP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 使用 Druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.18</version>
</dependency>

八、自定义 Starter 最佳实践

完整示例

1. starter pom.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>com.example</groupId>
    <artifactId>my-starter</artifactId>
    <version>1.0.0</version>
    
    <properties>
        <spring-boot.version>3.2.0</spring-boot.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring-boot.version}</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

2. 自动配置类

java
@AutoConfiguration
@EnableConfigurationProperties(MyProperties.class)
@ConditionalOnProperty(prefix = "my", name = "enabled", havingValue = "true")
public class MyAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyProperties properties) {
        return new MyService(properties);
    }
}

3. spring Boot 3.0+ 注册

src/main/resources/META-INF/spring/
com.example.my-starter.auto.MyAutoConfiguration

4. 条件注解类(可选)

java
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@ConditionalOnProperty(prefix = "my", name = "enabled")
public @interface ConditionalOnMyEnabled { }

九、Starter 使用注意事项

1. 避免版本冲突

xml
<!-- 方式1:通过 parent 管理版本 -->
<parent>spring-boot-starter-parent</parent>

<!-- 方式2:使用 dependencyManagement -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

2. 可选依赖

java
// @Autowired(required = false) 表示依赖可选
@Service
public class MyService {
    @Autowired(required = false)
    private Optional<CacheManager> cacheManager;
}

3. 条件启用

yaml
# 默认不启用,需要配置才会加载
my:
  enabled: false  # 默认 false
java
@ConditionalOnProperty(
    prefix = "my", 
    name = "enabled", 
    havingValue = "true",
    matchIfMissing = false  # 不配置默认为 false
)

十、面试高频问题

Q1: Starter 的实现原理?

  1. 定义 starter pom,引入依赖
  2. 提供自动配置类
  3. 注册到 META-INF/spring/*.imports
  4. 使用方引入 starter,自动生效

Q2: Spring Boot 如何管理依赖版本?

  • 通过 spring-boot-starter-parent 父 POM
  • <dependencyManagement> 统一管理版本
  • 子项目引入不指定版本,使用父 POM 仲裁版本

Q3: 如何排除某个 starter 的默认依赖?

xml
<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>

Q4: 常用 Starter 有哪些?

  • web(Spring MVC)
  • data-jpa / data-jdbc(数据访问)
  • data-redis(缓存)
  • security(安全)
  • actuator(监控)
  • validation(参数校验)

十一、下一章预告

下一章我们将学习 Spring Boot 配置文件详解

  • YAML vs Properties
  • 多环境配置
  • 配置绑定
  • 占位符与随机值

基于 MIT 许可发布