ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Spring Boot 2小时从零到一:快速构建独立生产级Java应用

Spring Boot 2小时从零到一:快速构建独立生产级Java应用 很多刚接触 Java 后端开发的同学面对 Spring、Spring MVC 那一套复杂的配置常常感到头疼从 XML 配置到各种 Bean 的组装还没开始写业务逻辑就已经被劝退了。如果你也有同感那么 Spring Boot 就是为你量身定制的“救星”。它通过约定大于配置的理念和强大的自动装配能力让开发者能快速搭建一个独立、生产级的应用。本文将带你用最直接的方式在 2 小时内从零构建一个完整的 Spring Boot 应用涵盖核心概念、环境搭建、项目创建、基础功能开发到打包部署的全流程帮你避开那些新手常踩的坑真正实现快速入门。1. Spring Boot 是什么为什么选择它在深入动手之前我们有必要先搞清楚 Spring Boot 到底是什么以及它解决了什么问题。这能帮助你理解后续每一步操作背后的逻辑而不是机械地复制命令。1.1 从 Spring 框架的演进说起传统的 Java EE 或 Spring 应用开发需要开发者手动配置大量的 XML 文件如applicationContext.xml,web.xml来声明 Bean、配置数据源、事务管理器、视图解析器等。这个过程繁琐、容易出错且项目结构臃肿。随着微服务架构的兴起需要快速创建大量轻量级、可独立部署的服务这种传统的重型配置方式成为了瓶颈。Spring Boot 正是在此背景下诞生的。它并非一个全新的框架而是对 Spring 框架本身的一种“封装”和“增强”。其核心设计哲学是“约定大于配置(Convention Over Configuration)”。这意味着Spring Boot 为大多数常见的开发场景提供了一套默认的、合理的配置。只要你遵循这些约定比如将配置文件命名为application.properties或application.yml 将启动类放在根包下就可以免去大量手动配置的工作。1.2 Spring Boot 的核心优势快速创建独立应用通过spring-boot-starter依赖和 Spring Initializr 工具可以在几秒钟内生成一个可运行的项目骨架。内嵌 Web 服务器无需部署 WAR 包到外部 Tomcat。Spring Boot 默认内嵌了 Tomcat也可选择 Jetty 或 Undertow应用本身就是一个可执行的 JAR 文件通过java -jar命令即可运行。自动配置这是 Spring Boot 的魔法所在。它会根据项目类路径下的 Jar 包即你引入的starter依赖自动推断并配置你需要的 Bean。例如当你引入了spring-boot-starter-data-jpa和 MySQL 驱动Spring Boot 会自动尝试配置一个DataSource和JpaTransactionManager。生产就绪特性提供了一系列用于生产环境监控和管理的特性如健康检查/actuator/health、指标收集/actuator/metrics、外部化配置等通过 Spring Actuator 模块轻松实现。无代码生成与 XML 配置Spring Boot 不需要任何代码生成也尽量避免 XML 配置全部通过 Java 注解和条件化配置来完成。简单来说Spring Boot 让开发者能够专注于业务逻辑What to build而不是基础设施的搭建How to build。2. 环境准备与工具选择工欲善其事必先利其器。在开始编码前请确保你的开发环境已就绪。2.1 基础环境要求Java 开发工具包 (JDK)Spring Boot 3.x 需要JDK 17或更高版本Spring Boot 2.x 需要JDK 8或更高版本推荐 JDK 11 或 17。本文以目前主流的Spring Boot 3.x JDK 17组合为例。检查安装在终端或命令行输入java -version确认版本。下载可从 Oracle JDK 或 OpenJDK 下载。构建工具Maven或Gradle。两者选其一即可Spring Boot 对两者都有很好的支持。Maven 在国内更普及本文使用 Maven 进行演示。检查安装在终端输入mvn -v。下载从 Maven官网 下载并配置MAVEN_HOME环境变量。集成开发环境 (IDE)强烈推荐使用IntelliJ IDEA Ultimate付费或 Community免费或Eclipse with STS (Spring Tool Suite)。IDEA 对 Spring Boot 的支持更为智能和流畅。本文演示使用 IntelliJ IDEA Community Edition。2.2 关于版本选择的建议Spring Boot 版本迭代很快。对于新项目建议直接使用当前官方维护的最新稳定版本。你可以通过 Spring Initializr 官网 查看默认推荐的版本。Spring Boot 2.x生态成熟社区资源丰富如果团队或项目历史原因需要沿用可选择 2.7.x已停止功能更新仅维护或 3.0.x。Spring Boot 3.x基于 Spring Framework 6最低要求 JDK 17支持 GraalVM 原生镜像是未来的方向。新手从 3.x 开始学习是更好的选择。重要原则在同一个项目中所有spring-boot-starter-*的依赖版本应由spring-boot-starter-parent统一管理避免版本冲突。3. 创建你的第一个 Spring Boot 项目我们将使用两种最主流的方式来创建项目通过Spring Initializr 网站和通过IntelliJ IDEA 内置工具。3.1 方式一通过 Spring Initializr 网站通用这是最官方、最通用的方式不依赖特定 IDE。访问网站打开浏览器访问 https://start.spring.io 。配置项目Project: 选择Maven Project。Language: 选择Java。Spring Boot: 选择最新的稳定版本如3.2.5。Project Metadata:Group: 公司或组织域名倒写例如com.example。Artifact: 项目名称例如demo。Name: 自动填充同 Artifact。Description: 项目描述可选。Package name: 自动生成通常是GroupArtifact如com.example.demo。Packaging: 选择Jar。Java: 选择17。添加依赖 (Dependencies)点击 “ADD DEPENDENCIES” 按钮搜索并添加我们第一个项目需要的依赖Spring Web: 用于构建 Web 应用包含 RESTful API 支持。Spring Boot DevTools: 开发工具支持热部署修改代码后无需重启应用。Lombok: 通过注解自动生成 Getter/Setter/构造函数等代码减少样板代码。生成项目点击页面底部的 “GENERATE” 按钮下载一个压缩包如demo.zip。导入 IDE解压压缩包用 IntelliJ IDEA 打开该文件夹。IDEA 会自动识别为 Maven 项目并开始下载依赖。3.2 方式二通过 IntelliJ IDEA推荐IDEA 集成了 Spring Initializr创建过程更流畅。新建项目打开 IDEA点击File-New-Project...。选择 Spring Initializr在左侧选择Spring Initializr。配置项目界面和网站类似填写Group,Artifact,Name选择Java 17和Spring Boot最新版本类型选Maven。选择依赖在下一步的依赖选择界面直接搜索并勾选Spring Web,Spring Boot DevTools,Lombok。完成创建点击FinishIDEA 会自动创建项目并下载依赖。创建完成后你的项目结构应该类似于下图在 IDEA 的 Project 视图中查看demo ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ └── DemoApplication.java # 项目主启动类 │ │ └── resources │ │ ├── application.properties # 配置文件或 application.yml │ │ └── static # 存放静态资源CSS, JS, 图片 │ │ └── templates # 存放模板文件Thymeleaf, FreeMarker │ └── test # 测试代码目录 ├── .gitignore ├── HELP.md ├── mvnw # Maven Wrapper (Unix) ├── mvnw.cmd # Maven Wrapper (Windows) └── pom.xml # Maven 项目对象模型依赖定义文件关键文件解读DemoApplication.java: 这是 Spring Boot 应用的入口。类上的SpringBootApplication注解是核心它开启了自动配置和组件扫描。pom.xml: Maven 的配置文件定义了项目依赖。打开它你会看到我们刚才选择的依赖。?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion !-- 继承 Spring Boot 的父项目统一管理版本 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version !-- 版本可能不同 -- relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIddemo/artifactId version0.0.1-SNAPSHOT/version namedemo/name descriptionDemo project for Spring Boot/description properties java.version17/java.version /properties dependencies !-- Web 启动器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 开发工具 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId scoperuntime/scope optionaltrue/optional /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency !-- 测试启动器 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins !-- Spring Boot Maven 插件用于打包和运行 -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project4. 编写第一个 RESTful API现在让我们来创建一个简单的接口体验一下 Spring Boot 开发有多快。4.1 创建控制器 (Controller)在src/main/java/com/example/demo/目录下新建一个类HelloController.java。package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; RestController // 这是一个组合注解包含了 Controller 和 ResponseBody表示这个类的所有方法返回的数据直接写入HTTP响应体。 public class HelloController { // 处理 GET 请求路径为 /hello GetMapping(/hello) public String sayHello(RequestParam(value name, defaultValue World) String name) { return Hello, name ! This is your first Spring Boot API.; } }代码解释RestController: 标明这是一个控制器并且其方法返回值直接作为 HTTP 响应内容通常是 JSON 或字符串而不是视图名称。GetMapping(“/hello”): 将 HTTP GET 请求映射到sayHello方法。当访问http://localhost:8080/hello时就会调用这个方法。RequestParam: 绑定请求参数。value “name”指定参数名defaultValue “World”设置默认值。如果请求是/hello?nameCSDN则name的值为 “CSDN”。4.2 运行并测试应用有几种方式可以运行 Spring Boot 应用在 IDEA 中直接运行找到DemoApplication.java文件点击其左侧的绿色三角形运行按钮或右键选择Run ‘DemoApplication’。使用 Maven 命令在项目根目录下打开终端执行mvn spring-boot:run。启动成功后你会在控制台看到类似以下的日志注意内嵌 Tomcat 的启动端口默认是8080... 2024-05-XX XX:XX:XX.XXX INFO 12345 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path 2024-05-XX XX:XX:XX.XXX INFO 12345 --- [ restartedMain] com.example.demo.DemoApplication : Started DemoApplication in 2.345 seconds (process running for 2.567)测试 API 打开你的浏览器或使用 Postman、curl 等工具访问http://localhost:8080/hello你会看到Hello, World! This is your first Spring Boot API.访问http://localhost:8080/hello?nameSpringBoot你会看到Hello, SpringBoot! This is your first Spring Boot API.恭喜你的第一个 Spring Boot 应用已经成功运行并对外提供了服务。4.3 热部署体验还记得我们引入了spring-boot-devtools吗现在来体验它的魔力。保持应用处于运行状态。修改HelloController中的返回字符串例如改成return “你好, “ name “! 这是你的第一个 Spring Boot API。”;保存文件 (CtrlS)。观察 IDEA 控制台你会看到应用自动重启或类重载的日志。刷新浏览器你会发现返回内容已经更新而无需手动停止和重启应用。注意某些 IDE 需要开启“自动编译”功能。在 IDEA 中确保Settings - Build, Execution, Deployment - Compiler - Build project automatically被勾选。5. 核心配置详解application.properties / application.ymlSpring Boot 的配置高度外部化允许你通过配置文件来调整应用行为而无需修改代码。支持两种格式properties和YAML。YAML 格式层次更清晰推荐使用。5.1 基本配置示例我们将src/main/resources/application.properties重命名为application.yml直接改后缀名并写入以下内容# 应用配置 spring: application: name: my-first-springboot-app # 应用名称会用于服务发现、监控等 # 服务器配置 server: port: 8081 # 修改内嵌服务器端口为 8081 servlet: context-path: /api # 为所有请求路径添加统一前缀 /api # 日志配置 logging: level: com.example.demo: DEBUG # 将我们自己包的日志级别设为 DEBUG方便调试 org.springframework.web: INFO file: name: logs/app.log # 将日志输出到文件 # 自定义配置演示如何读取 myapp: welcome: message: “Welcome to My Custom Spring Boot App”配置生效保存文件后由于spring-boot-devtools的存在应用会自动重启。此时我们的 API 访问地址变成了http://localhost:8081/api/hello。在项目根目录下会生成logs/app.log文件记录日志。5.2 如何在代码中读取配置创建一个配置类或直接在 Bean 中注入配置值。使用Value注解适合单个属性package com.example.demo; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class ConfigController { // 注入自定义配置 Value(“${myapp.welcome.message}”) private String welcomeMessage; GetMapping(“/config”) public String getConfig() { return “Config Message: “ welcomeMessage; } }访问http://localhost:8081/api/config将返回我们在yml中配置的消息。使用ConfigurationProperties注解适合一组相关属性更安全、更面向对象首先在yml中定义一组属性myapp: user: default-name: “Admin” default-role: “ROLE_USER”然后创建一个对应的 Java Bean 来绑定这些属性package com.example.demo.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; Component // 声明为 Spring 组件 ConfigurationProperties(prefix “myapp.user”) // 绑定前缀为 myapp.user 的所有属性 Data // Lombok 注解自动生成 getter/setter public class UserProperties { private String defaultName; private String defaultRole; // 属性名 default-name 会自动映射到 defaultName (kebab-case 转 camelCase) }最后在 Controller 或 Service 中注入并使用这个 Beanpackage com.example.demo; import com.example.demo.config.UserProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; RestController public class UserController { Autowired private UserProperties userProperties; GetMapping(“/user-info”) public String getUserInfo() { return “Default User: “ userProperties.getDefaultName() “, Role: “ userProperties.getDefaultRole(); } }6. 连接数据库以 H2 内存数据库为例一个完整的应用离不开数据持久化。Spring Boot 通过spring-boot-starter-data-jpa等 Starter 极大地简化了数据库操作。6.1 添加依赖与配置修改pom.xml在dependencies节点内添加以下依赖!-- Spring Data JPA -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency !-- H2 内存数据库 -- dependency groupIdcom.h2database/groupId artifactIdh2/artifactId scoperuntime/scope /dependency修改application.yml添加数据源和 JPA 配置spring: datasource: url: jdbc:h2:mem:testdb # 使用内存数据库数据库名为 testdb driver-class-name: org.h2.Driver username: sa password: password jpa: database-platform: org.hibernate.dialect.H2Dialect hibernate: ddl-auto: update # 启动时根据实体类自动更新表结构生产环境慎用或设为 none/validate show-sql: true # 在控制台打印执行的 SQL 语句便于调试 properties: hibernate: format_sql: true # 格式化打印的 SQL # H2 数据库控制台Web UI方便查看数据 h2: console: enabled: true # 启用 H2 控制台 path: /h2-console # 控制台访问路径6.2 创建实体类 (Entity) 和仓库接口 (Repository)实体类对应数据库中的一张表。在com.example.demo包下新建entity包并创建User.javapackage com.example.demo.entity; import jakarta.persistence.*; import lombok.Data; Entity // 标明这是一个 JPA 实体类 Table(name “user”) // 指定对应的表名如果省略则默认为类名 Data // Lombok 注解生成 getter, setter, toString, equals, hashCode 等方法 public class User { Id // 标明主键 GeneratedValue(strategy GenerationType.IDENTITY) // 主键自增策略 private Long id; Column(nullable false, length 50) // 对应数据库字段非空长度50 private String username; Column(nullable false, length 100) private String email; // 可以添加无参构造、全参构造但 Data 默认会生成无参构造。如果需要全参构造可以用 AllArgsConstructor }仓库接口继承 JpaRepository无需实现任何方法即可获得基础的 CRUD 操作。在com.example.demo包下新建repository包并创建UserRepository.javapackage com.example.demo.repository; import com.example.demo.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; Repository // 可省略因为 JpaRepository 本身已被 Spring 管理 public interface UserRepository extends JpaRepositoryUser, Long { // 这里可以定义自定义的查询方法Spring Data JPA 会根据方法名自动实现 // 例如User findByUsername(String username); }JpaRepositoryUser, Long中的User是实体类型Long是主键类型。6.3 编写 Service 和 Controller服务层 (Service)处理业务逻辑。在com.example.demo包下新建service包并创建UserService.javapackage com.example.demo.service; import com.example.demo.entity.User; import com.example.demo.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; Service // 声明为服务层组件 public class UserService { Autowired // 自动注入 UserRepository private UserRepository userRepository; public User createUser(User user) { // 简单的保存操作实际业务中可能需要校验等逻辑 return userRepository.save(user); } public ListUser getAllUsers() { return userRepository.findAll(); } public OptionalUser getUserById(Long id) { return userRepository.findById(id); } public void deleteUser(Long id) { userRepository.deleteById(id); } }控制器层 (Controller)对外提供 REST API。在com.example.demo包下新建controller包如果已有则直接在里面创建创建UserController.javapackage com.example.demo.controller; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; RestController RequestMapping(“/api/users”) // 为这个控制器下的所有请求路径添加前缀 /api/users public class UserController { Autowired private UserService userService; PostMapping public ResponseEntityUser createUser(RequestBody User user) { // RequestBody 表示从请求体中获取 JSON 数据并映射到 User 对象 User savedUser userService.createUser(user); return new ResponseEntity(savedUser, HttpStatus.CREATED); // 返回 201 Created 状态码 } GetMapping public ResponseEntityListUser getAllUsers() { ListUser users userService.getAllUsers(); return ResponseEntity.ok(users); // 返回 200 OK 和用户列表 } GetMapping(“/{id}”) public ResponseEntityUser getUserById(PathVariable Long id) { // PathVariable 从 URL 路径中获取变量 {id} OptionalUser user userService.getUserById(id); return user.map(ResponseEntity::ok) // 如果用户存在返回 200 OK 和用户 .orElse(ResponseEntity.notFound().build()); // 如果不存在返回 404 Not Found } DeleteMapping(“/{id}”) public ResponseEntityVoid deleteUser(PathVariable Long id) { userService.deleteUser(id); return ResponseEntity.noContent().build(); // 返回 204 No Content } }6.4 测试数据库 API重启应用确保所有更改已生效。使用 Postman 或 curl 测试POST 创建用户URL:POST http://localhost:8081/api/usersHeaders:Content-Type: application/jsonBody (raw JSON):{ “username”: “testuser”, “email”: “testexample.com” }响应应为 201 Created并返回带 id 的用户信息。GET 获取所有用户URL:GET http://localhost:8081/api/users响应应为 200 OK并包含用户列表。GET 获取单个用户URL:GET http://localhost:8081/api/users/1DELETE 删除用户URL:DELETE http://localhost:8081/api/users/1访问 H2 控制台在浏览器中打开http://localhost:8081/h2-console。JDBC URL:jdbc:h2:mem:testdb(与配置一致)Username:saPassword:password点击 Connect可以执行 SQLSELECT * FROM USER;查看我们通过 API 插入的数据。7. 常见问题与排查思路 (FAQ)在学习和使用 Spring Boot 的过程中你肯定会遇到各种问题。下面是一些高频问题的排查思路。问题现象可能原因排查步骤与解决方案应用启动失败报Port 8080 already in use端口被占用可能是另一个 Spring Boot 应用或其他进程1. 修改server.port配置为其他端口如 8081。2. 在命令行查找占用进程并终止netstat -ano | findstr :8080(Windows) 或lsof -i :8080(Mac/Linux)。引入依赖后启动报ClassNotFoundException或NoSuchMethodError依赖冲突或版本不兼容1. 运行mvn dependency:tree查看依赖树检查是否有多个不同版本的相同 Jar 包。2. 在pom.xml中使用exclusions排除冲突的传递依赖。3. 确保 Spring Boot 父项目 (spring-boot-starter-parent) 版本与所有spring-boot-starter-*版本一致。配置文件 (application.yml) 中的属性不生效1. 配置文件格式错误YAML 缩进问题。2. 配置文件未放在src/main/resources下。3. 属性名拼写错误。4. 配置类未加Component或ConfigurationProperties注解未生效。1. 检查 YAML 缩进必须是空格不能是 Tab。2. 确认文件位置和名称正确。3. 在应用启动日志中搜索 “The following profiles are active:” 和 “PropertySources”查看加载了哪些配置。4. 确保配置类被 Spring 扫描到在主启动类同级或子包下。Autowired注入失败报NoSuchBeanDefinitionException1. 被注入的类没有被 Spring 管理缺少Component,Service,Repository等注解。2. 组件扫描路径不对主启动类不在顶层包。3. 存在多个同类型的 Bean。1. 给需要注入的类加上合适的注解。2. 确保主启动类SpringBootApplication在项目的根包位置它能扫描同级及子包下的所有组件。3. 使用Qualifier注解指定 Bean 的名称。修改代码后热部署 (DevTools) 没有生效1. IDEA 的自动编译未开启。2. 构建工具 (Maven/Gradle) 需要手动触发编译。3. DevTools 的配置问题。1. IDEA 中开启Build project automatically(File - Settings - Build… - Compiler)。2. 按CtrlF9(Windows/Linux) 或CmdF9(Mac) 手动触发项目构建。3. 检查pom.xml中spring-boot-devtools依赖是否正确引入。访问 H2 控制台 (/h2-console) 报 4041.spring.h2.console.enabled未设置为true。2. 访问路径与配置的spring.h2.console.path不一致。3. 安全配置如 Spring Security拦截了请求。1. 确认application.yml中配置正确且已生效。2. 检查控制台启动日志确认 H2 Console 已初始化。3. 如果引入了 Spring Security需要配置忽略该路径的权限检查。8. 生产环境部署与打包开发完成后我们需要将应用部署到服务器上。Spring Boot 的打包方式非常简单。8.1 使用 Maven 打包在项目根目录下执行 Maven 命令mvn clean package这条命令会执行清理、编译、测试并最终在target/目录下生成一个可执行的 JAR 文件名称通常为{artifactId}-{version}.jar例如demo-0.0.1-SNAPSHOT.jar。关键点这个 JAR 是“可执行”且“内嵌容器”的 Fat Jar/Uber Jar。它包含了应用代码、所有依赖库以及内嵌的 Tomcat 服务器。8.2 运行 JAR 包将生成的 JAR 包上传到服务器或直接在本地测试在 JAR 包所在目录执行java -jar demo-0.0.1-SNAPSHOT.jar应用就会以我们在application.yml中配置的方式启动。生产环境配置通常生产环境的配置如数据库连接、日志级别与开发环境不同。Spring Boot 支持Profile来管理多环境配置。创建配置文件在resources目录下创建application-dev.yml(开发环境)application-prod.yml(生产环境)配置差异在application-prod.yml中覆盖生产环境需要的配置例如spring: datasource: url: jdbc:mysql://prod-db-host:3306/mydb?useSSLfalseserverTimezoneUTC username: prod_user password: ${DB_PASSWORD} # 推荐使用环境变量传递密码 server: port: 80 logging: file: name: /var/log/myapp/app.log激活 Profile在运行 JAR 时通过命令行参数指定激活哪个 Profilejava -jar demo-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod或者在application.yml中设置默认激活的 Profilespring.profiles.active: prod不推荐将生产配置硬编码在默认文件中。8.3 关于 Docker 部署Docker 是更流行的部署方式。创建一个简单的Dockerfile在项目根目录# 使用官方 Eclipse Temurin 17 运行时作为父镜像 FROM eclipse-temurin:17-jre-alpine # 设置工作目录 WORKDIR /app # 将构建好的 jar 包复制到容器中 COPY target/demo-0.0.1-SNAPSHOT.jar app.jar # 暴露端口与 server.port 一致 EXPOSE 8081 # 运行 jar 包 ENTRYPOINT [“java”, “-jar”, “app.jar”]然后构建并运行 Docker 镜像# 构建镜像 docker build -t my-springboot-app . # 运行容器映射端口并激活生产 profile docker run -d -p 8080:8081 -e “SPRING_PROFILES_ACTIVEprod” --name myapp my-springboot-app9. 下一步学习路线与最佳实践建议通过上面的步骤你已经成功搭建了一个具备 REST API 和数据库交互能力的 Spring Boot 应用。但这只是起点。要成为一名合格的 Spring Boot 开发者你还需要深入学习以下内容深入理解 Spring 核心虽然 Boot 简化了配置但 IoC控制反转、DI依赖注入、AOP面向切面编程这些 Spring 核心概念是基础必须掌握。Spring Data JPA 进阶学习复杂查询Query、关联映射OneToMany,ManyToOne、事务管理Transactional。项目分层架构巩固 Controller-Service-Repository 的分层模式理解每层的职责。异常处理使用ControllerAdvice和ExceptionHandler实现全局异常处理返回统一的错误响应格式。接口文档集成Swagger/OpenAPI如 SpringDoc OpenAPI自动生成 API 文档。安全认证集成Spring Security实现登录、权限控制、JWT 令牌等。缓存使用 Spring Cache 抽象集成 Redis 等缓存中间件。消息队列集成 RabbitMQ 或 Kafka 进行异步解耦。分布式配置与注册中心学习使用Nacos、Apollo或Spring Cloud Config管理配置使用Nacos、Eureka进行服务注册与发现微服务入门。监控与运维深入使用Spring Boot Actuator并集成Prometheus和Grafana进行监控。最佳实践建议配置文件管理敏感信息密码、密钥切勿提交到代码仓库。使用环境变量、配置中心或 Docker Secrets。日志规范使用 SLF4J Logback/Log4j2合理设置日志级别对日志进行归档和监控。统一响应封装设计统一的 API 响应体包含 code, message, data便于前端处理。输入验证在 Controller 层使用Valid注解配合 JSR-303 规范如NotNull,Size进行参数校验。单元测试为 Service 层和 Repository 层编写单元测试JUnit 5 Mockito为 Controller 层编写集成测试SpringBootTest。代码风格遵循团队代码规范使用 Checkstyle、SpotBugs 等工具进行代码质量检查。Spring Boot 的强大之处在于其丰富的生态和“开箱即用”的特性。遇到问题时多查阅 官方文档 多在社区交流动手实践是学习的最佳途径。希望这篇“无废话”指南能帮你顺利踏上 Spring Boot 之旅少走弯路快速构建出强大的应用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进