我带过不少新人几乎每个新手在接触 Java Web 的第一周都会问我同一个问题Spring Boot 到底该从哪里开始尤其是那种好像看了一堆教程自己一动手就报错的状态特别打击信心。今天这篇就是照着30 分钟快速入门的标准给你写的目标只有一个让一个从没写过 Spring Boot 的小白亲手把一个 Web 应用跑起来看到自己的接口返回 JSON。文里会覆盖环境准备、项目创建、第一个接口、依赖注入、配置与日志这些核心环节也会提前告诉你最容易踩的坑在哪里。先说结论30 分钟这个目标完全现实而且这 30 分钟里有一大半时间是花在确保环境没问题和等 Maven 下载依赖上真正让你写代码的时间并不长。你需要的只是 JDK、一个 IDEA以及一点点耐心。1. 为什么 30 分钟能跑起来一个 Spring Boot Web 应用1.1 Spring 时代的配置地狱到底有多可怕很多教程喜欢直接教你怎么写代码但从来不解释Spring Boot 为什么要出现。如果你没经历过 Spring 早期的开发方式你很难理解 Boot 到底帮你省掉了多少工作量。在 Spring Boot 出现之前一个最普通的 Spring MVC 项目需要你手动做这些事情在 pom.xml 里一个一个添加 spring-webmvc、jackson-databind、tomcat-embed-core 等依赖再写一个 web.xml 配置 DispatcherServlet 的映射规则还要写一个 spring-mvc.xml 去配置组件扫描、视图解析器、静态资源路径。这些配置加起来少说几十行 XML多则上百行。配置之间稍有冲突启动直接报错而且报错信息往往很长新手根本看不懂。我当年学 Spring 的时候光是把一个 Hello World 跑起来就花了两天最后发现是 XML 里少写了一个mvc:annotation-driven /。这种挫败感相信老 Java 程序员都懂。1.2 Spring Boot 到底做了什么starter、自动配置、内嵌服务器Spring Boot 解决问题的思路可以概括为三件事。第一starter 依赖。以前你要自己拼装多个库的版本现在只需要一个spring-boot-starter-web它就会把 Web 开发所需的 spring-webmvc、Jackson、Tomcat、校验等一堆依赖一次性打包给你。版本冲突问题基本不用你操心因为 Boot 已经帮你锁好了一整套兼容版本。第二自动配置。Boot 会根据你 classpath 里有哪些依赖自动生成对应的 Bean。比如你引入了 Redis 的 starter它就自动帮你配置 RedisTemplate引入了 MyBatis 的 starter它就自动帮你配置 SqlSessionFactory。你不需要写那些 XML甚至大多数情况下一个application.yml就够了。第三内嵌服务器。传统 Web 项目要把应用打成 war 包丢到外置 Tomcat 的 webapps 目录里才能运行。Spring Boot 应用直接内嵌了一个 Tomcat你用java -jar就能把整个 Web 应用跑起来。本地开发和测试极其方便。这里顺便说一个很多人混乱的概念Spring、Spring Boot、微服务是什么区别简单说Spring 是个大框架提供 IoC、AOP、事务管理等核心能力Spring Boot 是 Spring 的启动加速器让 Spring 项目能快速跑起来微服务是一种架构风格通常用 Spring Cloud 来实现。入门阶段你只需要把 Spring Boot 用熟微服务可以之后再学。1.3 30 分钟的时间账怎么算为了让你对30 分钟上手有个具体感知我按小白的正常进度列了一个时间分配表时间段要完成的事0-5 分钟确认 JDK 和 IDEA 已就绪版本没问题5-10 分钟在 start.spring.io 创建项目并导入 IDEA10-15 分钟等待 Maven 下载依赖网络好可能只要两三分钟15-25 分钟写第一个接口启动应用浏览器访问成功25-30 分钟看完配置、日志和常见坑心里有数如果你以前已经装过 JDK 和 IDEA时间会更充裕。如果完全没有环境建议先把软件的下载时间排除在这 30 分钟之外因为软件安装速度取决于你的网络和电脑性能不算写代码的范畴。2. 环境准备卡住 80% 新手的前置条件2.1 JDK 版本别选错Java 17 还是 21很多新手环境装好了却启动不了 Spring Boot大概率是 JDK 版本不匹配。这里有个硬性条件Spring Boot 3.x 要求 Java 17 或更高。如果你用的是 Java 8那只能跑 Spring Boot 2.x不能跑 3.x。现在的情况我建议你直接安装 Java 21。原因很简单21 是 LTS 长期支持版本Spring Boot 3.x 完美支持而且现在社区里讨论的Java 21 搭配 Spring Boot 3.5 启用虚拟线程这类新玩法都是以 JDK 21 为基础的。你直接装 21相当于一次到位不用以后升级。Java 17 也能用但如果你现在是从零开始没必要选一个次新版本。验证 JDK 是否安装成功打开终端Windows 是 CMD 或 PowerShellMac 是 Terminal输入java -version javac -version如果出现版本号说明 JDK 没问题。注意javac -version这个命令很多人会忽略如果它提示找不到命令说明你的环境变量配置有问题需要回到安装步骤重新配置JAVA_HOME。我推荐的 JDK 发行版是 Adoptium Temurin也就是 Eclipse 基金会维护的 OpenJDK 构建版本。也可以直接用 Oracle JDK或者你 IDEA 自带的 JBRJetBrains Runtime也能当运行时用。总之别去网上随便下载来路不明的安装包版本对不上能折磨你半天。2.2 IDEA 社区版 Maven 的组合IDE 选 IntelliJ IDEA 基本是 Java 开发的默认答案。新手用社区版Community Edition完全够用它免费、稳定Spring Boot 开发需要的功能都有。如果你以后要做企业级开发再考虑旗舰版但入门阶段不需要花钱。Maven 的作用是管理依赖和构建项目。你不一定需要单独安装 Maven因为 IDEA 每个版本都内置了 Maven。打开 IDEA 后在 Settings - Build Tools - Maven 里能看到它默认使用的 Maven 版本。这里我提醒一句内置 Maven 和独立安装的 Maven 是两回事新手用内置 Maven 就够了但你要知道 maven 的配置文件settings.xml在哪个位置因为后面配置镜像需要用到它。在 IDEA 中打开 Settings - Build Tools - Maven会显示 User settings file 的路径默认是C:\Users\你的用户名\.m2\settings.xml或者 Linux/Mac 下的~/.m2/settings.xml。如果这个文件不存在就新建一个。2.3 Maven 镜像配置换掉默认中央仓库Maven 默认从 Maven Central 中央仓库下载依赖在国内速度有时候比较慢尤其第一次创建项目时需要拉取大量 jar 包等十几分钟甚至报错都很常见。解决办法是配置阿里云镜像。在settings.xml中加入如下内容mirrors mirror idaliyunmaven/id name阿里云公共仓库/name mirrorOfcentral/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror /mirrors这里mirrorOf写成central表示只替换中央仓库不会影响其他私有仓库。配置完保存回到 IDEA右侧 Maven 面板点一下 Reload All Maven Projects之后的下载速度会明显提升。我遇到过读者把镜像配置放进settings.xml却始终不生效最后发现原因很无语IDEA 里选的 settings 文件路径不是他改的那个。所以在改配置之前先确认 Settings - Build Tools - Maven 里显示的路径再把文件放在那里。3. 创建项目的姿势网页、IDEA 与命令行实测3.1 推荐路线start.spring.io 网页创建Spring 官方提供了一个项目生成器网站叫 Spring Initializr地址是 start.spring.io。这是创建 Spring Boot 项目最标准的姿势也是我推荐新手使用的路线。操作流程很短打开网页左侧选择构建工具为 Maven语言选 JavaSpring Boot 版本选默认的最新稳定版默认就是 3.x不用担心然后在 Dependencies 里搜索并勾选Spring Web最后点 Generate 按钮浏览器会下载一个 zip 压缩包。解压后得到一个标准的项目目录。用 IDEA 打开File - Open选中解压出来的文件夹IDEA 识别到 pom.xml 后会自动导入项目然后开始下载依赖。这一步你可能需要等一会儿等右下角的进度条跑完项目结构完全展开就说明导入成功了。为什么不让你一开始就勾很多依赖新手很容易在创建项目时看到一堆名字就勾选比如 Spring Security、MyBatis、Redis 全选上。结果项目还没跑起来先遇到一堆启动报错因为很多依赖需要额外的配置才能初始化。我的建议是第一节课只加Spring Web跑通了再慢慢加。3.2 IDEA 内置创建器同样能打如果你不想打开浏览器IDEA 本身也内置了 Spring Initializr。新建项目时选择 Spring Initializr这时候界面跟网页版几乎一样项目 SDK 选择你本地安装的 Java 版本Type 选 MavenPackage 填com.exampleName 填demo然后在 Dependencies 里勾选 Web - Spring Web最后点 Finish。IDEA 会直接联网下载依赖并生成项目。这个方式适合你不方便打开网页的情况。两个方式生成的项目结构一模一样没有本质区别。3.3 命令行生成效率党的选择对已经熟悉命令行的开发者来说还有一种更轻量的方式直接用 curl 生成项目压缩包curl https://start.spring.io/starter.zip -d dependenciesweb -d javaVersion21 -o demo.zip执行完会得到一个demo.zip解压即可。这种方式适合以后你写脚本或自动化创建项目时用新手没必要为了省这几步专门去学知道有这回事就行。3.4 项目目录结构说明这些文件都干啥无论用哪种方式创建项目结构都是这样的demo ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── com/example/demo/DemoApplication.java │ │ └── resources │ │ └── application.properties │ └── test │ └── java/com/example/demo/DemoApplicationTests.javapom.xml是 Maven 的核心配置文件里面声明了项目的坐标、Java 版本、Spring Boot 版本和依赖。DemoApplication.java是启动类它里面有个main方法运行它就能启动整个应用。application.properties是配置文件后面我们通常会改名为application.yml。test目录暂时不用管。这里有一个极其重要的点启动类DemoApplication.java的位置必须放在包的最外层。比如你的包名是com.example.demo那么启动类必须在com.example.demo这个包下而不能随便放到子包里。因为 Spring Boot 会以启动类所在的包为基准往下扫描所有子包里的组件。启动类放错了位置你写的 Controller 会全部变成 404。这个坑我见过无数次先在这里给你打预防针。4. 你写的第一个接口背后发生了什么4.1 SpringBootApplication 三个注解的真相打开DemoApplication.java你会看到package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }这个SpringBootApplication是 Spring Boot 最核心的注解但它其实是三个注解的组合SpringBootConfiguration本质是Configuration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration负责自动配置Spring Boot 会根据你引入的依赖自动创建一大波 Bean。ComponentScan负责扫描当前包及其子包下的组件比如Controller、Service、Repository标注的类。Configuration则允许你在类里面定义额外的配置 Bean。所以你看一行注解就完成了装配上下文 自动配置 组件扫描三件事。这就是 Spring Boot 为什么省事的原因。4.2 写一个返回 JSON 的 GET 接口在启动类同目录下新建一个类HelloController.java内容如下package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; RestController public class HelloController { GetMapping(/hello) public MapString, String hello() { return Map.of(message, Hello Spring Boot); } }写完直接运行DemoApplication的main方法。你会看到控制台刷出一堆日志最后关键的一句是Tomcat started on port 8080。这时候打开浏览器访问http://localhost:8080/hello你会看到页面显示出 JSON{message:Hello Spring Boot}到这一步你的第一个 Spring Boot Web 应用已经跑通了。从写代码到看到结果整个过程不超过五分钟。4.3 从 URL 到 JSON 的完整链路很多新手看到结果会很开心但并不知道中间发生了什么。这里我把链路拆一遍你以后学习 Spring MVC 会顺畅很多。浏览器发起GET http://localhost:8080/hello请求。Tomcat 在 8080 端口接收到这个请求把它交给 Spring MVC 的核心分发器 DispatcherServlet。DispatcherServlet 根据 URL 路径/hello找到匹配的方法也就是HelloController.hello()。方法执行完后返回一个Map对象Spring 内置的 Jackson 组件把这个对象序列化成 JSON 字符串再通过 HTTP 响应返回给浏览器。所以RestController是这里的关键。它等于Controller加上ResponseBody意思是这个类的每个方法的返回值都会直接写入 HTTP 响应体而不是跳转到一个视图页面。在前后端分离的今天绝大多数后端接口都是这么写的。4.4 为什么你不需要配 Tomcat 和 web.xml也许你会问我没装 Tomcat为什么它自己跑起来了因为spring-boot-starter-web这个依赖里面已经包含了spring-boot-starter-tomcat。Spring Boot 的自动配置在检测到 classpath 里有 Tomcat 相关类后会自动创建一个内嵌的 Tomcat 实例然后把你应用里的接口部署进去。你运行main方法时Tomcat 也随之启动。这也就解释了为什么不需要 web.xml、不需要外置服务器。Spring Boot 应用是一个自带引擎的自动挡汽车启动即跑停止即走。5. 依赖注入Spring 容器怎么把 Bean 装进你的代码5.1 IoC 和 DI用一顿饭就能讲清楚学会了写一个接口你已经可以玩一阵子了。但你要开始理解 Spring 的核心机制——依赖注入因为后面所有项目都绕不开容器的概念。先做个类比。传统做法是你想用到某个类就在代码里new一个出来相当于做饭的每一道菜都要自己去买菜、洗菜、切菜。Spring 的做法是中央厨房你只需要告诉它你需要什么食材它会提前把食材准备好直接送到你手里。这个中央厨房就是 Spring 容器它负责创建和管理的对象统称为 Bean。控制权从你手动 new变成了容器统一管理这就是控制反转IoC。而把 Bean 传递给你的过程就是依赖注入DI。5.2 三种注入方式对比构造器注入是第一选择Spring 支持三种依赖注入方式字段注入、Setter 注入、构造器注入。字段注入是把Autowired直接写在属性上代码最简洁RestController public class HelloController { Autowired private GreetingService greetingService; }Setter 注入是通过 setter 方法注入。构造器注入则是在构造函数上注入RestController public class HelloController { private final GreetingService greetingService; public HelloController(GreetingService greetingService) { this.greetingService greetingService; } }我强烈建议你使用构造器注入。原因有三个第一依赖关系一目了然所有必填依赖都在构造函数签名里第二final修饰让 Bean 初始化后不可变减少被篡改的风险第三单元测试时你可以直接new一个 Controller传入 mock 的对象不需要 Spring 容器参与。字段注入虽然写起来省事但很难测试也容易让依赖关系隐藏得很深。5.3 一个典型的 Controller 到 Service 的例子现在我们把上面的代码补全做一个稍微真实一点的例子。新建一个GreetingServicepackage com.example.demo; import org.springframework.stereotype.Service; Service public class GreetingService { public String greet(String name) { return 你好 name; } }Service注解让 Spring 容器把这个类注册为 Bean。然后改写HelloControllerpackage com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; RestController public class HelloController { private final GreetingService greetingService; public HelloController(GreetingService greetingService) { this.greetingService greetingService; } GetMapping(/hello/{name}) public String hello(PathVariable String name) { return greetingService.greet(name); } }重启应用访问http://localhost:8080/hello/小明你会看到你好小明这里发生的事是Spring 启动时扫描到GreetingService带Service注解就创建了一个 Bean。然后容器在创建HelloController时发现构造函数需要一个GreetingService就把已有的 Bean 注入进来。整个过程你不需要写一行new。5.4 新手常遇的 Bean 相关报错依赖注入最常见的一个异常是NoSuchBeanDefinitionException意思是容器里找不到需要的 Bean。原因通常有三种类上忘了加Service、Repository这类注解类的包路径不在启动类的扫描范围之下或者 Bean 是接口类型而容器里已经没有实现类。排查思路就是按这三条逐一检查。另一个坑是循环依赖比如 A 服务依赖 B 服务B 服务又依赖 A 服务。Spring Boot 2.6 之后默认禁止循环依赖启动时会直接报错。解决方式不是调配置去允许它而是重构代码把两边共同依赖的公共逻辑抽出来放到一个新的类里。关于Bean和Autowired还有不少细节比如同一个接口有多个实现类时需要用Qualifier指定名字这些你可以后面再深入学。今天只要理解了容器 注入这个基本模型就已经比 80% 的新手强了。6. 配置与日志这两件事早晚要会6.1 从 properties 到 yml端口、上下文路径怎么配application.properties是 Spring Boot 默认的配置文件但实际项目中大家更常用application.yml因为 YAML 格式的层级结构更容易阅读。你可以直接把文件改名或者新建一个application.yml两者同时存在时yml优先级更高。写一个最常用的配置server: port: 8081 servlet: context-path: /demo spring: application: name: quickstart-demoserver.port指定端口如果你不想用默认的 8080改成 8081 就行。spring.application.name是应用名称后续做微服务用注册中心时会用到。context-path是访问路径前缀配置后所有接口前都要加/demo例如访问地址变成http://localhost:8081/demo/hello。YAML 格式有个大坑缩进必须正确。多一个空格少一个空格启动时可能直接报错。新手遇到配置读不到的情况先检查缩进。6.2 多环境配置dev、prod 分开管理真实项目不会只有一个环境。本地开发连本地数据库测试环境连测试库生产环境连生产库各自的配置还不一样。Spring Boot 的约定是把不同环境的配置写在application-dev.yml、application-prod.yml这种带有环境后缀的文件里然后在主配置文件中指定激活哪个环境spring: profiles: active: dev启动时Spring Boot 会读取application.yml作为公共配置再叠加application-dev.yml里的内容。你切换环境只需要改active一个值不需要大动干戈。顺带一提生产环境的密码、密钥这类敏感信息不要直接写进application-prod.yml更不要提交到 Git 仓库。实际项目里一般通过环境变量或者专门的配置中心注入这个等你做到真实项目再研究。6.3 日志配置别再用 System.out.println 了新手最常见的习惯是打印调试信息用System.out.println。这个习惯在练习项目里没问题进了团队会被人劝退。原因很简单System.out.println没有日志级别没有时间戳没有文件名线上排障时根本没法用它定位问题。Spring Boot 默认接入了 Logback 日志框架你要做的只是配置它。比如logging: level: root: info com.example.demo: debug file: name: logs/quickstart.log这个配置的意思是全局日志级别是info但com.example.demo包下可以使用debug级别输出更详细的日志日志同时写入logs/quickstart.log文件。代码里怎么输出日志呢推荐用 Lombok 的Slf4j注解或者在类里声明import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloController { private static final Logger log LoggerFactory.getLogger(HelloController.class); }Slf4j方案更简洁你在 pom.xml 里引入一个 Lombok 依赖就能用。后面你打调试日志就写log.debug(xxx)正式信息就写log.info(xxx)。这里我建议新手把com.example.demo的级别临时调成debug看一次启动日志。你会看到 Spring Boot 打印了大量自动配置的过程信息比如哪些条件匹配、哪些配置被跳过。别看它长这对你理解框架底层非常有帮助。7. 五个新手高发问题排查从 404 到端口占用7.1 端口占用8080 起不来怎么办你第一次启动如果看到这样的日志Web server failed to start. Port 8080 was already in use.说明 8080 端口已经被其他程序占了。解决方式有两种。第一种是换端口在application.yml里加上server.port: 8081重启应用。第二种是找到占用的进程并处理。Windows 下执行netstat -ano | findstr 8080输出里最后一列是进程 ID然后用taskkill /PID 你的进程ID /FMac 和 Linux 下用lsof -i:8080 kill -9 进程ID要注意的是如果占用端口的是你自己之前启动没关掉的 Spring Boot 应用直接去 IDEA 里的控制台点停止按钮就行不用杀进程。7.2 404controller 路径和扫描范围访问接口得到 404最常见的有四种情况。第一URL 路径拼错。明明写的是/hello你访问的是/hello/或者大小写写错都会 404。先去检查浏览器地址栏和GetMapping里的值是否完全一致。第二启动类的位置放错。前面强调过启动类必须在包的顶层它下面的子包才会被扫描。如果你把 Controller 放在了com.example.controller而启动类在com.example.demo那启动类的扫描范围是com.example.demo及子包扫不到com.example.controllerController 就不会被注册。第三类上没加RestController或Controller。没加注解Spring 根本不知道这是一个 Web 控制器。第四项目依赖有问题Spring MVC 没初始化。这种一般伴随其他报错排查起来也复杂一些。7.3 405请求方式和接收参数不匹配404 解决之后你还可能遇到 405 Method Not Allowed。这通常是因为接口只支持 GET你却用 POST 请求访问。GetMapping限定了 GETPostMapping限定了 POST两者不能混用。还有一种情况是请求时参数对不上。比如接口定义成GetMapping(/hello/{name}) public String hello(PathVariable String name) { ... }你访问/hello而没有带{name}会匹配不上路由。如果参数类型不匹配比如name定义成Integer你传了个字母进去还会得到 400 Bad Request。遇到这种问题先看控制台日志Spring 会告诉你具体哪个参数解析失败。7.4 依赖下载慢、失效代码改了没生效Maven 依赖下载慢的问题前面说过用阿里云镜像解决。但还有一个常见情况配置了镜像IDEA 里改了 pom.xml项目就是不动。这是因为你修改 pom 后没有触发依赖刷新。正确做法是在 IDEA 右侧的 Maven 面板点一下 Reload All Maven Projects 图标。有时候还需要右键项目 - Maven - Reload Project。刷新后如果还有依赖报错去本地 Maven 仓库目录~/.m2/repository把对应的文件夹删掉再重新 Reload让它重新下载。代码改了不生效则大概率是没重新编译没重启。Spring Boot 默认不会热加载修改 Java 代码后需要重新运行main方法。如果你觉得麻烦可以加一个spring-boot-devtools依赖它能在代码变化后自动重启提高开发效率。7.5 IDEA 控制台中文乱码运行项目后控制台输出一堆乱码一般出现在 Windows 系统的 IDEA 里。原因是 IDEA 默认编码和系统编码不一致。解决步骤Settings - File Encodings把 Global Encoding、Project Encoding、Default encoding for properties files 三项全部改为 UTF-8。如果还乱打开 Help - Edit Custom VM Options添加一行-Dfile.encodingUTF-8然后重启 IDEA。大多数情况这样就能解决。这五个坑基本覆盖了我带新人时 90% 的启动问题。你只要在遇到报错时不要慌先看最下面的关键信息再根据这里的方法排查跑通一个项目并不难。8. 下一步路标从能跑到会做项目8.1 尽快过渡到三层结构你会写 Controller 并且理解了依赖注入之后下一步就要把代码从全都塞在一个类里改成三层结构。标准做法是把代码分成三层Controller 层负责接收 HTTP 请求、返回响应Service 层负责业务逻辑Repository 层负责操作数据库。对应到包结构就是com.example.demo ├── controller ├── service └── repository为什么要分层不是形式主义。三层各司其职后Controller 会变得很薄几乎不写业务逻辑Service 是核心可以被多个 Controller 复用Repository 只跟数据打交道。这样后续加功能、改逻辑、做单元测试都很清晰。我见过很多新手把数据库查询、业务判断、返回结果全写在 Controller 一个类里一时爽项目一复杂就完全没法维护。等你把三层结构写熟练再去接触数据库相关的 starter比如spring-boot-starter-data-jpa或 MyBatis就能自然地把三层结构和数据库串起来。网上那些基于 Spring Boot 的校园讲座预约系统、企业办公用品管理系统、商城之类的毕设题目内核基本都是这套结构加上一些 CRUD 接口底层逻辑并不神秘。8.2 数据库、缓存、文件存储、WebSocket 按什么顺序学跑通接口之后大多数人会开始研究集成各种外部组件。我的建议顺序是数据库 - 缓存 - 文件存储 - 实时通信。数据库是必学的先 JPA 或 MyBatis 二选一即可。缓存可以从 Caffeine 本地缓存开始它简单到你只需要加一个依赖和一行配置就能把热点数据放进内存适合单机应用。文件存储可以了解一下 MinIO这是目前很常用的开源对象存储服务做头像上传、文件管理这类功能时很实用。WebSocket 则用于实时推送场景比如讲座预约系统里的余票提醒、办公用品管理系统里的审批通知Spring Boot 集成 WebSocket 在 yml 里配置好端点就能用。这四样东西每一样单独学都不难关键是不要一次全上。每集成一个组件就跑通一个最小示例确认无误后再加下一个。8.3 Java 21 虚拟线程与高并发初体验如果你用了 Java 21 搭配 Spring Boot 3.5现在还有一个值得关注的玩法虚拟线程。传统 Web 应用中每个请求通常占用一个操作系统线程线程在等待数据库 IO 或远程调用时会被白白阻塞。虚拟线程则是一种轻量级线程创建成本极低特别适合 IO 密集型的 Web 场景。启用方式非常简单在application.yml里加一行配置spring: threads: virtual: enabled: true前提是你的 JDK 是 21Spring Boot 版本在 3.2 以上。开启后Spring Boot 的 Web 容器会使用虚拟线程处理请求对高并发场景的吞吐量有明显改善。你不需要改业务代码只是多了一个性能提升开关。不过我要说句实在话虚拟线程不是银弹。如果你有同步锁、阻塞调用、固定线程池这些老代码直接启用可能不但没提升反而出问题。入门阶段你先知道有这回事等真正做高并发项目时再深挖。8.4 毕设和真实项目怎么选先抄后改最后聊聊很多人关心的学完基础之后做什么。每年都会有人问我毕设该怎么选题。我的建议是不要一上来就想创新先找一个现有的开源项目或者课程项目把它的代码完整读懂、跑通、能改 bug然后基于它做自己的改造。比如讲座预约系统你先搞清楚用户、讲座、报名这三张表的关系再考虑加一个抢座功能或者消息通知创新点自然就有了。商城、办公用品管理系统的逻辑也大同小异。带新人这几年我最深的体会是Spring Boot 入门难度的瓶颈从来不在框架本身而在环境、报错和不知道下一步看哪里。这篇教程你跟着走完一遍后我建议立刻扔掉教程自己动手做一个小需求比如做一个待办清单的接口包含新增、查询、删除三个功能。等你能不依赖任何教程写出这几个接口你就已经从小白正式变成入门了。