使用 Spring Boot 进行开发
构建系统
Spring Boot 官方推荐使用 Maven 或 Gradle 作为构建工具,它们都支持 Spring Boot 提供的依赖管理。
依赖管理(BOM)
Spring Boot 的每个版本都附带一份经过测试和兼容的依赖清单(spring-boot-dependencies),涵盖所有 Spring 模块和常用第三方库。
使用父 POM 或 BOM 导入后,大部分依赖无需指定版本号:
<!-- 使用 spring-boot-starter-parent(推荐) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.2</version>
</parent>
<dependencies>
<!-- 无需指定版本 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>不使用父 POM
如果项目已有自己的父 POM,可以改用 BOM 导入:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>WARNING
Spring Boot 每个版本都绑定特定版本的 Spring Framework,不要自行指定 Spring Framework 版本号。
Maven 插件
spring-boot-maven-plugin 提供以下核心功能:
| 命令 | 功能 |
|---|---|
mvn spring-boot:run | 直接运行 Spring Boot 应用 |
mvn package | 打包为可执行 JAR(通过 repackage 目标) |
mvn spring-boot:build-image | 构建 OCI 容器镜像 |
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>Gradle 插件
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}| 命令 | 功能 |
|---|---|
gradle bootRun | 直接运行 |
gradle bootJar | 打包为可执行 JAR |
gradle bootBuildImage | 构建容器镜像 |
代码结构
推荐结构
com/
+- example/
+- myapplication/
+- MyApplication.java ← 主类(@SpringBootApplication)
|
+- controller/
| +- UserController.java ← Controller 层
+- service/
| +- UserService.java ← Service 层
+- repository/
| +- UserRepository.java ← 数据访问层
+- model/
| +- User.java ← 实体/模型
+- config/
+- SecurityConfig.java ← 配置类主类位置
主类应放在根包中。默认情况下,@SpringBootApplication 会扫描主类所在包及其子包下的所有组件。
// 正确:主类在根包
package com.example.myapplication;
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}如果主类不在根包,需要手动指定 @ComponentScan 或 @SpringBootApplication(scanBasePackages = ...)。
配置类
@Configuration
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}@EnableAutoConfiguration
Spring Boot 会根据 classpath 中的依赖自动推断配置。通常不直接使用,而是通过 @SpringBootApplication 包含。
条件注解
| 注解 | 生效条件 |
|---|---|
@ConditionalOnClass | classpath 中存在指定类 |
@ConditionalOnMissingBean | 容器中不存在指定 Bean |
@ConditionalOnProperty | 配置文件中包含指定属性 |
@ConditionalOnExpression | SpEL 表达式为 true |
@Configuration
@ConditionalOnClass(DataSource.class)
public class DatabaseConfig {
// 只有 classpath 中有 DataSource 时才生效
}Bean 与依赖注入
组件扫描
@SpringBootApplication 默认扫描主类所在包。常用组件注解:
| 注解 | 作用 |
|---|---|
@Component | 通用组件 |
@Service | Service 层 |
@Repository | DAO 层 |
@Controller / @RestController | Controller 层 |
@Service
public class UserService {
private final UserRepository repository;
// 构造函数注入(推荐)
public UserService(UserRepository repository) {
this.repository = repository;
}
}运行应用程序
从 IDE 运行
直接运行主类的 main 方法即可,无需任何额外配置。
从 Maven 运行
mvn spring-boot:run从已打包的 JAR 运行
java -jar target/myapp-0.0.1-SNAPSHOT.jar
# 指定端口
java -jar target/myapp-0.0.1-SNAPSHOT.jar --server.port=8081
# 指定活跃 Profile
java -jar target/myapp-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod热重载(DevTools)
Spring Boot DevTools 提供开发时的热重载能力:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>| 功能 | 说明 |
|---|---|
| 自动重启 | classpath 文件变更后自动重启(比手动重启快) |
| 禁用缓存 | 模板引擎缓存自动关闭 |
| LiveReload | 内置 LiveReload 服务器,浏览器自动刷新 |
| 远程调试 | 支持远程应用的热更新(生产环境禁用) |
TIP
DevTools 会自动禁用缓存(Thymeleaf、Freemarker 等),修改模板后无需重启即可看到效果。
打包
可执行 JAR
Spring Boot Maven Plugin 的 repackage 目标会创建一个"胖 JAR",包含所有依赖:
mvn clean package
# 运行
java -jar target/myapp-0.0.1-SNAPSHOT.jarDocker 镜像
使用 Cloud Native Buildpacks 无需 Dockerfile 即可构建镜像:
mvn spring-boot:build-image
docker run -p 8080:8080 myapp:0.0.1-SNAPSHOT分层 JAR
Spring Boot 2.3+ 支持分层 JAR,优化 Docker 镜像的缓存利用:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>分层后的 Dockerfile:
FROM eclipse-temurin:17-jre AS builder
COPY target/*.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract
FROM eclipse-temurin:17-jre
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]这样只修改业务代码时,无需重新下载依赖层。
外部化配置
配置优先级
Spring Boot 支持多种配置来源,优先级从高到低:
- 命令行参数(
--server.port=8081) - 操作系统环境变量(
SERVER_PORT=8081) - Profile 特定配置(
application-prod.properties) - 应用默认配置(
application.properties或application.yml)
常用配置
# application.yml
server:
port: 8080
spring:
application:
name: demo
datasource:
url: jdbc:mysql://localhost:3306/db
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
logging:
level:
com.example: DEBUG多环境配置
# application-dev.yml
server:
port: 8080
# application-prod.yml
server:
port: 80激活指定环境:
java -jar app.jar --spring.profiles.active=prod@ConfigurationProperties
将配置属性绑定到类型安全的 Java Bean:
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String version;
// getter / setter
}对应的配置:
app:
name: MyApp
version: 1.0.0Starters 速查
Spring Boot Starters 是一组预定义的依赖描述:
| Starter | 功能 |
|---|---|
spring-boot-starter-web | Web 应用(Spring MVC + Tomcat) |
spring-boot-starter-webflux | 响应式 Web(WebFlux + Netty) |
spring-boot-starter-data-jpa | JPA + Hibernate |
spring-boot-starter-data-redis | Redis + Lettuce |
spring-boot-starter-security | Spring Security |
spring-boot-starter-test | JUnit 5 + Mockito + AssertJ |
spring-boot-starter-validation | Bean Validation |
spring-boot-starter-actuator | 生产监控端点 |
spring-boot-starter-mail | 邮件发送 |
spring-boot-starter-thymeleaf | Thymeleaf 模板引擎 |