公司动态

Spring Boot 快速入门:从零构建 CRUD 后台管理系统

📅 2026/7/20 13:54:08
Spring Boot 快速入门:从零构建 CRUD 后台管理系统
Spring Boot 应该怎么学如果你正在寻找一条能快速上手、直击核心、并能立刻产出可运行项目的学习路径这篇文章就是为你准备的。我们不会从冗长的历史背景讲起而是直接切入主题Spring Boot 的核心价值在于它能让你“直接运行”一个生产级的、独立的 Spring 应用极大地简化了传统 Spring 应用的配置和部署复杂度。对于初学者或希望快速构建原型的开发者来说这意味着你可以把精力集中在业务逻辑上而不是繁琐的 XML 配置和服务器部署上。这篇文章将采用一种“直男式”的实践教学法目标是在短时间内让你掌握 Spring Boot 的核心用法。我们将重点关注几个关键问题如何从零开始创建一个 Spring Boot 项目如何集成数据库和前端模板如何打包部署以及如何理解其核心的“自动装配”原理。整个过程将围绕一个具体的、可运行的示例项目展开确保你每一步都有代码可写有结果可看。本文适合有一定 Java 基础但对 Spring 框架感到陌生或畏惧希望快速上手 Spring Boot 进行 Web 开发的开发者。我们将使用当前主流的工具链IntelliJ IDEA、Maven、Spring Boot 2.7.x/3.x、MySQL、MyBatis-Plus 和 Thymeleaf这些都是企业级开发中的常见组合。通过本文你将能独立搭建一个具备基础 CRUD 功能的后台管理系统骨架。1. Spring Boot 核心能力速览在深入细节之前我们先通过一个表格快速了解 Spring Boot 能为你做什么以及它的技术门槛。能力项说明项目类型用于快速构建独立的、生产级的 Spring 应用程序的框架。核心特点约定大于配置提供大量“Starter”依赖简化构建内嵌 Web 服务器Tomcat/Jetty/Undertow无需部署 WAR 包自动装配根据类路径自动配置 Bean。学习门槛要求具备 Java SE 基础了解 Servlet、MVC 基本概念更佳。无需预先精通 Spring Framework 的全部细节。开发环境JDK 8 或更高版本Spring Boot 2.x 支持 JDK 8-193.x 需 JDK 17推荐使用 IntelliJ IDEA 或 Eclipse STS构建工具 Maven 或 Gradle。硬件门槛无特殊要求。普通开发电脑即可内存建议 8GB 以上用于同时运行 IDE、数据库和多个服务。启动方式通过运行main方法直接启动内嵌服务器或使用mvn spring-boot:run命令亦可打包成可执行的 JAR 文件运行。是否支持 API是。原生支持构建 RESTful API是微服务架构中的核心组件。是否适合批量任务是。通过 Spring Batch 模块可以方便地处理批处理任务。适合场景快速原型开发、微服务、前后端分离的后端服务、传统单体 Web 应用、批处理应用等。从上表可以看出Spring Boot 的设计初衷就是降低 Spring 的使用门槛让开发者能快速启动和运行项目。接下来我们将从环境准备开始一步步验证这些能力。2. 适用场景与使用边界Spring Boot 并非万能钥匙理解其适用场景和边界能帮助你更好地进行技术选型。它非常适合以下场景快速启动新项目无论是毕业设计、课程作业还是内部工具Spring Initializr 能在几分钟内生成一个可运行的项目骨架。微服务开发作为独立的、轻量级的服务单元Spring Boot 是构建微服务架构的事实标准之一易于容器化Docker和编排Kubernetes。构建 RESTful API对于移动端、前端Vue/React提供数据接口的后端服务Spring Boot 的 Web 模块和注解驱动开发效率极高。集成各类中间件通过对应的 Starter如spring-boot-starter-data-redis,spring-boot-starter-kafka可以几乎零配置地集成 Redis、Kafka、Elasticsearch 等流行组件。传统 Web 应用配合 Thymeleaf、Freemarker 等模板引擎快速开发服务端渲染的管理后台。它可能不是最佳选择或需要额外注意的边界极度轻量级的场景如果项目极其简单只是一个命令行工具或简单的脚本引入 Spring Boot 可能会显得臃肿可以考虑更轻量的框架如 Micronaut 或 Quarkus。对启动时间极度敏感传统的 Spring Boot 应用启动时间相对于原生编译应用较长。虽然 Spring Boot 3 的 Native ImageGraalVM特性可以极大改善但增加了构建复杂性。高度定制化的遗留系统集成如果需要与大量使用非标准配置或老旧技术的系统深度集成Spring Boot 的“约定”有时会成为束缚需要花费精力覆盖自动配置。学习边界Spring Boot 简化了配置但并未简化 Spring 的核心概念如IoC、AOP。若要深入排查问题或进行高级定制仍需理解 Spring Framework 的基础。3. 环境准备与前置条件开始实战前请确保你的开发环境满足以下要求。这是后续所有操作能顺利进行的基础。3.1 基础软件安装JDK这是必须的。Spring Boot 2.7.x 推荐使用 JDK 8 或 11Spring Boot 3.x 必须使用 JDK 17 或更高版本。建议安装 JDK 17以兼顾新特性和广泛兼容性。在终端输入java -version验证。java -version # 预期输出类似openjdk version 17.0.10 2024-01-16Maven项目管理工具。用于下载依赖、编译和打包。安装后在终端输入mvn -v验证。mvn -v # 预期输出包含 Apache Maven 版本号和 Java 版本信息。IntelliJ IDEA推荐使用社区版或旗舰版。确保已安装并配置好 JDK 和 Maven。在File - Settings - Build, Execution, Deployment - Build Tools - Maven中检查 Maven 路径。3.2 数据库准备可选但推荐我们将集成 MySQL 数据库。你需要安装 MySQL5.7 或 8.0 版本。启动 MySQL 服务。使用命令行或图形化工具如 Navicat, DBeaver创建一个新的数据库例如springboot_demo。CREATE DATABASE IF NOT EXISTS springboot_demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;3.3 检查端口占用Spring Boot 默认使用8080端口。确保该端口未被其他程序如其他 Tomcat 实例、某些开发服务器占用。在 Windows 上可以使用netstat -ano | findstr :8080查看在 Linux/Mac 上使用lsof -i:8080查看。4. 创建第一个 Spring Boot 项目我们将使用 IntelliJ IDEA 内置的 Spring Initializr 来创建项目这是最直观的方式。4.1 通过 Spring Initializr 创建项目打开 IntelliJ IDEA选择New Project。在左侧选择Spring Initializr。Project SDK选择你安装的 JDK 17。选择 Initializr Service URL默认使用官方的https://start.spring.io即可。项目元数据Project MetadataGroup通常为公司或组织域名倒写例如com.example。Artifact项目名称例如demo。Type选择Maven。Language选择Java。Packaging选择Jar。Java Version选择17。Version默认即可。选择依赖Dependencies这是关键步骤我们一次性添加常用依赖。点击Add Dependencies按钮搜索并添加Spring Web用于构建 Web 应用和 RESTful API。Thymeleaf模板引擎用于服务端渲染 HTML。MyBatis Framework或直接搜索并添加MyBatis Plus如果 Initializr 支持。这里我们先添加MyBatis Framework后续再手动改为 MyBatis-Plus。MySQL DriverMySQL 数据库驱动。Lombok通过注解简化 Java Bean 的 Getter/Setter 等方法强烈推荐。点击Next选择项目存储位置然后点击Finish。IDEA 会自动下载项目模板和依赖这可能需要一些时间。4.2 项目结构解析创建完成后你会看到类似如下的项目结构demo ├── src │ ├── main │ │ ├── java │ │ │ └── com │ │ │ └── example │ │ │ └── demo │ │ │ └── DemoApplication.java // 主启动类 │ │ └── resources │ │ ├── static // 存放静态资源CSS, JS, 图片 │ │ ├── templates // 存放 Thymeleaf 模板文件 │ │ └── application.properties // 配置文件 │ └── test // 测试代码目录 └── pom.xml // Maven 项目对象模型文件DemoApplication.java中的main方法就是整个应用的入口。application.properties是核心配置文件。5. 配置与基础功能测试项目创建好后我们先进行最小化配置和测试确保基础环境是通的。5.1 配置数据库连接打开src/main/resources/application.properties文件添加以下配置# 应用服务端口如果8080被占用可修改 server.port8080 # 数据库连接配置 spring.datasource.urljdbc:mysql://localhost:3306/springboot_demo?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghai spring.datasource.usernameroot # 你的数据库用户名 spring.datasource.password123456 # 你的数据库密码 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver # 配置 MyBatis使用 MyBatis-Plus 后部分配置会覆盖 mybatis.mapper-locationsclasspath:mapper/*.xml mybatis.type-aliases-packagecom.example.demo.entity # Thymeleaf 配置非必须但建议关闭缓存以便开发时实时预览 spring.thymeleaf.cachefalse spring.thymeleaf.modeHTML spring.thymeleaf.encodingUTF-8注意请将username和password替换为你自己 MySQL 的凭据。5.2 将 MyBatis 替换为 MyBatis-PlusMyBatis-Plus 是 MyBatis 的增强工具能极大简化 CRUD 操作。在pom.xml中找到mybatis-spring-boot-starter依赖将其替换为 MyBatis-Plus 的依赖!-- 移除或注释掉原有的 MyBatis 依赖 -- !-- dependency -- !-- groupIdorg.mybatis.spring.boot/groupId -- !-- artifactIdmybatis-spring-boot-starter/artifactId -- !-- version2.3.0/version -- !-- /dependency -- !-- 添加 MyBatis-Plus 依赖 -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version !-- 请使用当前最新稳定版 -- /dependency同时在application.properties中可以添加 MyBatis-Plus 的配置它会兼容大部分 MyBatis 配置# MyBatis-Plus 配置 mybatis-plus.mapper-locationsclasspath:mapper/*.xml mybatis-plus.type-aliases-packagecom.example.demo.entity # 控制台打印 SQL 日志开发环境非常有用 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl5.3 创建第一个 REST 接口进行测试在com.example.demo包下新建一个controller包并在其中创建HelloController.javapackage com.example.demo.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController // 表示这是一个 REST 风格的控制器返回 JSON 数据 RequestMapping(/api) // 为这个控制器下的所有接口添加统一前缀 /api public class HelloController { GetMapping(/hello) public String sayHello() { return Hello, Spring Boot!; } }5.4 启动并验证找到DemoApplication.java右键点击Run ‘DemoApplication.main()‘。观察控制台日志如果没有报错并看到类似Tomcat started on port(s): 8080 (http)的日志说明启动成功。打开浏览器或使用curl命令访问http://localhost:8080/api/hello。你应该能看到页面显示Hello, Spring Boot!。curl http://localhost:8080/api/hello # 预期输出Hello, Spring Boot!至此你的第一个 Spring Boot 应用已经成功运行并对外提供了 API 服务。6. 集成 MyBatis-Plus 实现 CRUD接下来我们实现一个完整的用户管理模块涵盖实体类、Mapper、Service、Controller 和页面。6.1 创建实体类Entity在com.example.demo包下新建entity包创建User.javapackage com.example.demo.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; Data // Lombok 注解自动生成 getter, setter, toString 等方法 TableName(sys_user) // 指定对应的数据库表名 public class User { TableId(type IdType.AUTO) // 主键自增 private Long id; private String username; private String password; private String email; private String phone; private LocalDateTime createTime; private LocalDateTime updateTime; }6.2 创建数据库表在 MySQL 的springboot_demo数据库中执行以下 SQLCREATE TABLE sys_user ( id bigint NOT NULL AUTO_INCREMENT, username varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 用户名, password varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 密码, email varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 邮箱, phone varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 手机号, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci COMMENT用户表;6.3 创建 Mapper 接口在com.example.demo包下新建mapper包创建UserMapper.javapackage com.example.demo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.demo.entity.User; import org.apache.ibatis.annotations.Mapper; Mapper // 标记为 MyBatis 的 MapperSpring 会自动扫描并注入 public interface UserMapper extends BaseMapperUser { // 继承 BaseMapper 后已经拥有了基础的 CRUD 方法无需编写 XML }MyBatis-Plus 的强大之处在于通过继承BaseMapper你无需编写任何 SQL即可拥有insert,deleteById,updateById,selectById,selectList等方法。6.4 创建 Service 层在com.example.demo包下新建service包创建UserService.java接口及其实现类。UserService.java(接口):package com.example.demo.service; import com.baomidou.mybatisplus.extension.service.IService; import com.example.demo.entity.User; public interface UserService extends IServiceUser { // 可以在此定义业务特有的方法 boolean checkUserExists(String username); }UserServiceImpl.java(实现类):package com.example.demo.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.demo.entity.User; import com.example.demo.mapper.UserMapper; import com.example.demo.service.UserService; import org.springframework.stereotype.Service; Service // 标记为 Spring 的 Service 组件 public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { Override public boolean checkUserExists(String username) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.eq(User::getUsername, username); return this.count(wrapper) 0; } }同样继承ServiceImpl后也自动拥有了基础的 CRUD 能力。6.5 创建 Controller 和页面在controller包下创建UserController.java用于处理 Web 请求。package com.example.demo.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.demo.entity.User; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; Controller // 注意这里是 Controller不是 RestController因为要返回视图 RequestMapping(/user) public class UserController { Autowired private UserService userService; // 用户列表页 GetMapping(/list) public String list(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, Model model) { PageUser page new Page(pageNum, pageSize); LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.orderByDesc(User::getCreateTime); PageUser userPage userService.page(page, wrapper); model.addAttribute(page, userPage); return user/list; // 对应 templates/user/list.html } // 跳转到新增用户页面 GetMapping(/add) public String toAdd() { return user/add; } // 执行新增用户操作 PostMapping(/add) public String add(User user) { user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(LocalDateTime.now()); userService.save(user); return redirect:/user/list; // 重定向到列表页 } // 跳转到编辑用户页面 GetMapping(/edit/{id}) public String toEdit(PathVariable Long id, Model model) { User user userService.getById(id); model.addAttribute(user, user); return user/edit; } // 执行更新用户操作 PostMapping(/update) public String update(User user) { user.setUpdateTime(LocalDateTime.now()); userService.updateById(user); return redirect:/user/list; } // 删除用户 GetMapping(/delete/{id}) public String delete(PathVariable Long id) { userService.removeById(id); return redirect:/user/list; } }6.6 创建 Thymeleaf 模板页面在src/main/resources/templates下新建user文件夹并创建三个 HTML 文件。list.html(用户列表页):!DOCTYPE html html xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 title用户列表/title link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/bootstrap5.3.0/dist/css/bootstrap.min.css /head body div classcontainer mt-4 h2用户管理/h2 a th:href{/user/add} classbtn btn-primary mb-3新增用户/a table classtable table-bordered table-striped thead tr thID/th th用户名/th th邮箱/th th手机号/th th创建时间/th th操作/th /tr /thead tbody tr th:eachuser : ${page.records} td th:text${user.id}/td td th:text${user.username}/td td th:text${user.email}/td td th:text${user.phone}/td td th:text${#temporals.format(user.createTime, yyyy-MM-dd HH:mm:ss)}/td td a th:href{/user/edit/{id}(id${user.id})} classbtn btn-sm btn-warning编辑/a a th:href{/user/delete/{id}(id${user.id})} classbtn btn-sm btn-danger onclickreturn confirm(确定删除吗)删除/a /td /tr /tbody /table !-- 分页组件 -- nav ul classpagination li classpage-item th:classappend${page.current 1} ? disabled : a classpage-link th:href{/user/list(pageNum${page.current-1}, pageSize${page.size})}上一页/a /li li classpage-item th:eachi : ${#numbers.sequence(1, page.pages)} th:classappend${i page.current} ? active : a classpage-link th:href{/user/list(pageNum${i}, pageSize${page.size})} th:text${i}/a /li li classpage-item th:classappend${page.current page.pages} ? disabled : a classpage-link th:href{/user/list(pageNum${page.current1}, pageSize${page.size})}下一页/a /li /ul /nav /div /body /htmladd.html和edit.html类似是表单页面用于新增和编辑用户代码结构相似此处省略。6.7 功能验证重启DemoApplication。访问http://localhost:8080/user/list。首次访问列表为空。点击“新增用户”填写表单并提交。返回列表页查看新增的用户数据并测试编辑和删除功能。观察 IDEA 控制台MyBatis-Plus 打印的 SQL 日志会清晰展示执行的INSERT、SELECT、UPDATE、DELETE语句。至此一个具备完整 CRUD 功能的 Spring Boot MyBatis-Plus Thymeleaf 的 Web 应用就完成了。这个过程几乎没有手写 SQL极大地提升了开发效率。7. 核心原理自动装配浅析Spring Boot 的魔力很大程度上来源于“自动装配”Auto-Configuration。理解它能帮你更好地驾驭和定制框架。7.1 自动装配是什么简单说Spring Boot 在启动时会根据你项目中引入的依赖jar 包自动推断并创建你需要的 Spring Bean并完成相应的配置。例如当你引入了spring-boot-starter-web它会自动配置一个内嵌的 Tomcat 服务器。注册DispatcherServletSpring MVC 的核心控制器。配置默认的视图解析器、消息转换器等。7.2 如何工作关键在SpringBootApplication注解和spring.factories文件。SpringBootApplication是一个组合注解它包含了EnableAutoConfiguration。EnableAutoConfiguration会触发 Spring Boot 去扫描所有 jar 包中META-INF/spring.factories文件里org.springframework.boot.autoconfigure.EnableAutoConfiguration键对应的配置类。这些配置类如WebMvcAutoConfiguration,DataSourceAutoConfiguration使用ConditionalOnClass,ConditionalOnMissingBean等条件注解来判断是否生效。例如DataSourceAutoConfiguration只有在类路径下存在DataSource.class且你没有自己定义DataSourceBean 时才会自动配置一个基于application.properties的DataSource。7.3 如何查看和调试在application.properties中开启调试日志可以查看自动装配的详细报告debugtrue启动应用后控制台会打印出Positive matches生效的配置和Negative matches未生效的配置这对于排查“为什么我的配置没生效”非常有帮助。7.4 如何覆盖自动配置自动配置不是强制性的。如果你想自定义只需自己声明一个同类型的 Bean 即可。Spring Boot 的条件注解ConditionalOnMissingBean会检测到已存在的 Bean从而跳过自动配置。例如你想自定义一个DataSourceConfiguration public class DataSourceConfig { Bean ConfigurationProperties(prefix spring.datasource.hikari) // 使用 HikariCP 连接池 public DataSource dataSource() { return DataSourceBuilder.create().build(); } }8. 打包与部署开发完成后我们需要将应用打包以便在其他环境运行。8.1 使用 Maven 打包在项目根目录下执行 Maven 命令mvn clean package -DskipTests命令执行成功后会在target目录下生成一个以项目名和版本命名的.jar文件例如demo-0.0.1-SNAPSHOT.jar。这个 JAR 包是“可执行的”Executable JAR因为它内嵌了 Tomcat 服务器和所有依赖。8.2 运行 JAR 包在命令行中进入target目录直接使用java -jar命令运行cd target java -jar demo-0.0.1-SNAPSHOT.jar应用会以与在 IDEA 中相同的方式启动。你可以通过--server.port8081参数来修改运行端口java -jar demo-0.0.1-SNAPSHOT.jar --server.port80818.3 部署到外部 Tomcat传统 WAR 包方式虽然 Spring Boot 推荐使用内嵌服务器但有时也需要部署到外部 Tomcat。修改pom.xml中的打包方式packagingwar/packaging修改主启动类继承SpringBootServletInitializerSpringBootApplication public class DemoApplication extends SpringBootServletInitializer { Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(DemoApplication.class); } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }重新打包mvn clean package -DskipTests生成demo-0.0.1-SNAPSHOT.war。将 WAR 包部署到外部 Tomcat 的webapps目录下即可。9. 常见问题与排查方法在学习和使用 Spring Boot 过程中你可能会遇到以下典型问题。问题现象可能原因排查方式解决方案启动失败端口被占用默认端口 8080 被其他进程占用。控制台日志会明确提示Port 8080 was already in use。使用netstat -ano | findstr :8080或lsof -i:8080查找占用进程。1. 终止占用进程。2. 在application.properties中修改server.port。3. 启动时指定参数--server.port新端口。无法连接到数据库数据库配置错误、服务未启动、网络不通、驱动版本不匹配。检查控制台启动日志通常会有详细的连接错误信息。核对application.properties中的url,username,password。1. 确保 MySQL 服务已启动。2. 检查连接字符串和凭据。3. 对于高版本 MySQL驱动类名应为com.mysql.cj.jdbc.DriverURL 中需指定时区serverTimezone。访问页面报 404请求路径错误、Controller 未扫描到、静态资源位置不对。1. 检查浏览器地址栏 URL 与RequestMapping定义的路径是否匹配。2. 检查启动类是否在 Controller 的上级包中组件扫描范围。1. 确保 Controller 类上有Controller或RestController注解。2. 确保启动类位于项目根包下或使用ComponentScan手动指定扫描包。3. 静态资源放于src/main/resources/static下。MyBatis-Plus 的 BaseMapper 方法不生效Mapper 接口未被 Spring 管理。检查 Mapper 接口上是否有Mapper注解或在启动类上添加了MapperScan。1. 在 Mapper 接口上添加Mapper。2. 或在启动类上添加MapperScan(com.example.demo.mapper)。Lombok 注解不生效找不到 getter/setterIDE 未启用 Lombok 插件或注解处理未开启。编译时报错cannot find symbol。1. 在 IntelliJ IDEA 中安装 Lombok 插件并重启。2. 在Settings - Build, Execution, Deployment - Compiler - Annotation Processors中勾选Enable annotation processing。修改代码后热部署不生效未开启 DevTools 或 IDE 配置问题。每次修改都需要手动重启应用。1. 在pom.xml中添加spring-boot-devtools依赖。2. 在 IDEA 中Settings - Build, Execution, Deployment - Compiler勾选Build project automatically。然后按CtrlShiftAlt/选择Registry勾选compiler.automake.allow.when.app.running。打包后运行找不到主清单属性打包时未包含 Spring Boot 的 Maven 插件。执行java -jar时报错no main manifest attribute。确保pom.xml中包含了spring-boot-maven-plugin。配置文件属性不生效属性名拼写错误、配置位置优先级问题、未刷新。使用Value注入时值为null或默认值。1. 检查属性名是否正确注意中划线和下划线。2. 了解配置优先级命令行参数 application-{profile}.propertiesapplication.properties 默认配置。3. 使用ConfigurationProperties进行类型安全的绑定。10. 最佳实践与进阶方向掌握了基础之后遵循一些最佳实践能让你的项目更健壮、更易维护。10.1 配置管理多环境配置使用application-{profile}.properties文件。例如application-dev.properties开发环境application-prod.properties生产环境。通过启动参数--spring.profiles.activeprod来激活。配置外化敏感信息如数据库密码不应硬编码在配置文件中。可以使用环境变量或配置中心如 Spring Cloud Config, Nacos, Apollo。使用 YAMLYAML 格式application.yml比 Properties 格式更清晰支持层级结构。10.2 代码结构分层清晰严格遵循 Controller - Service - Mapper 的分层架构各司其职。统一响应封装为 REST API 设计统一的响应体如包含 code, message, data 字段便于前端处理。全局异常处理使用ControllerAdvice和ExceptionHandler捕获和处理全局异常返回友好的错误信息。参数校验在接收参数的 DTO 类上使用javax.validation注解如NotBlank,Email进行校验并在 Controller 方法参数前加Valid。10.3 安全与监控集成 Spring Security为 Web 应用添加认证和授权功能。使用 Actuator添加spring-boot-starter-actuator依赖暴露应用的健康、指标、信息等端点方便监控。日志规范使用 SLF4J Logback合理配置日志级别和输出格式将日志输出到文件以便排查问题。10.4 下一步可以探索的方向集成 Redis用于缓存、Session 共享添加spring-boot-starter-data-redis依赖。集成消息队列如 RabbitMQ (spring-boot-starter-amqp) 或 Kafka (spring-boot-starter-kafka)实现异步和解耦。构建 RESTful API深入使用RestController,GetMapping,PostMapping,RequestBody,PathVariable等注解设计规范的 API。前后端分离后端只提供 JSON API前端使用 Vue/React并通过 Spring Boot 解决跨域问题CrossOrigin或配置WebMvcConfigurer。微服务入门学习 Spring Cloud将单体应用拆分为多个独立的 Spring Boot 服务。单元测试为 Service 和 Controller 编写单元测试和集成测试使用spring-boot-starter-test。Spring Boot 的学习曲线前期非常平缓能让你快速获得成就感。它的价值在于通过“约定”和“自动装配”屏蔽了大量复杂性让开发者能聚焦业务。本文带你走完了从环境搭建、项目创建、数据库集成、CRUD 实现到打包部署的完整闭环。最值得你立刻动手尝试的就是按照步骤创建一个自己的项目并实现一个简单的业务模块。在这个过程中你遇到的大部分问题都可以通过分析控制台日志、检查依赖和配置、以及查阅官方文档来解决。当你熟悉了这套流程Spring Boot 将成为你手中构建 Java Web 应用最得力的工具。