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-web | Web 开发(Spring MVC + Tomcat) |
| spring-boot-starter-webflux | 响应式 Web(Reactor + Netty) |
| spring-boot-starter-websocket | WebSocket |
| spring-boot-starter-web-services | Web Services |
数据 Starter
| Starter | 引入的依赖 |
|---|---|
| spring-boot-starter-data-jpa | Spring Data JPA + Hibernate |
| spring-boot-starter-data-mongodb | MongoDB |
| spring-boot-starter-data-redis | Redis + Lettuce |
| spring-boot-starter-data-elasticsearch | Elasticsearch |
| spring-boot-starter-jdbc | JDBC + HikariCP |
| spring-boot-starter-data-cassandra | Cassandra |
安全 Starter
| Starter | 引入的依赖 |
|---|---|
| spring-boot-starter-security | Spring Security |
| spring-boot-starter-oauth2-resource-server | OAuth2 资源服务器 |
| spring-boot-starter-oauth2-client | OAuth2 客户端 |
其他 Starter
| Starter | 引入的依赖 |
|---|---|
| spring-boot-starter-validation | Hibernate Validator |
| spring-boot-starter-cache | Spring Cache |
| spring-boot-starter-mail | Java Mail |
| spring-boot-starter-thymeleaf | Thymeleaf 模板 |
| spring-boot-starter-amqp | RabbitMQ |
| spring-boot-starter kafka | Kafka |
四、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-webspring-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.MyAutoConfiguration4. 条件注解类(可选)
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 # 默认 falsejava
@ConditionalOnProperty(
prefix = "my",
name = "enabled",
havingValue = "true",
matchIfMissing = false # 不配置默认为 false
)十、面试高频问题
Q1: Starter 的实现原理?
- 定义 starter pom,引入依赖
- 提供自动配置类
- 注册到
META-INF/spring/*.imports - 使用方引入 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
- 多环境配置
- 配置绑定
- 占位符与随机值