Spring Boot 是什么:从零启动一个 Web 服务
难度:中级 | 预计时间:45 分钟 | 前置:JVM 初探
📖 加几个注解就能跑一个服务器?
故事背景
你是个前端,习惯了 npm run dev 或 npx serve 启动本地服务器。现在要写后端——你打开 IDEA,新建一个空项目,心里盘算着:要写多少行代码才能让一个 HTTP 服务跑起来?Servlet?Tomcat 配置?web.xml?端口绑定?
然后你发现了 Spring Boot——加一个注解,写一个方法,mvn spring-boot:run,浏览器打开 localhost:8080——"Hello, World!" 就出来了。你愣了:就这么简单?对,就这么简单。Spring Boot 就是 Java 生态里的**"开箱即用"**——它把 Web 服务器、依赖管理、配置约定全部打包好了。作为前端,你可以把它理解为 Java 界的 Next.js——约定优于配置,自动帮你干了 80% 的脏活。
💻 代码演示
一个最简 Spring Boot 应用——5 个关键元素,比 HelloWorld.java 多不了几行:
// 1. 主启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 这个注解 = @Configuration + @EnableAutoConfiguration + @ComponentScan
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// 2. 控制器——处理 HTTP 请求
import org.springframework.web.bind.annotation.*;
@RestController // = @Controller + @ResponseBody(返回 JSON)
public class HelloController {
@GetMapping("/hello") // 处理 GET http://localhost:8080/hello
public String sayHello() {
return "Hello, Spring Boot!";
}
@GetMapping("/api/user/{id}") // 路径参数
public String getUser(@PathVariable Long id) {
return "用户ID: " + id;
}
@GetMapping("/api/greet") // 查询参数
public String greet(@RequestParam(defaultValue = "World") String name) {
return "Hello, " + name + "!";
}
}
// pom.xml 核心依赖(只需要这一个starter!)
// <dependency>
// <groupId>org.springframework.boot</groupId>
// <artifactId>spring-boot-starter-web</artifactId>
// </dependency>运行输出:
# 终端运行
$ mvn spring-boot:run
# 浏览器访问
$ curl http://localhost:8080/hello
Hello, Spring Boot!
$ curl http://localhost:8080/api/user/42
用户ID: 42
$ curl http://localhost:8080/api/greet?name=前线开发者
Hello, 前线开发者!🎯 三个核心问题
这是什么?
Spring Boot 是 Spring 家族里的"快速启动器"——它基于 Spring Framework,但通过自动配置(Auto-Configuration)和起步依赖(Starter)让你不必手动拼装几十个依赖。
IoC 容器(Inversion of Control)是 Spring 的心脏——你不再 new 对象,而是告诉容器"我需要一个 UserService",容器帮你创建、注入、管理生命周期。
嵌入式 Tomcat——不用单独安装和配置 Tomcat,它已经打包在你的 jar 里了。
为什么需要它?
为什么 Java 后端开发几乎必学 Spring Boot?①它是行业事实标准——90% 以上的 Java 后端岗位要求 ②极大降低启动成本——一个 starter 搞定 Web + JSON + 日志 ③生态丰富——Spring Data、Spring Security、Spring Cloud 无缝集成。前端类比:就像 React 生态里的 Next.js——不用从零配 Webpack/Babel/Router。
如果没有它会怎样?
如果没有 Spring Boot,你得手动配置 Servlet 容器、web.xml、依赖版本兼容、JSON 序列化库……一个 Hello World 可能需要半天时间在配置文件上。Spring Boot 的哲学是把"大家都这么配"变成默认值,你只需要写不一样的。
📝 原理讲解
Spring Boot 核心概念速查:
@SpringBootApplication:三合一注解。启动类上必须有它——告诉 Spring "从这里开始扫描"。
@RestController:标记一个类为 REST 控制器,所有方法返回值自动序列化为 JSON(通过 Jackson)。
@GetMapping / @PostMapping / @PutMapping / @DeleteMapping:绑定到 HTTP 方法。路径支持
{变量}和正则。@PathVariable:提取 URL 路径中的变量(REST 风格)。
@RequestParam:提取查询参数
?key=value。IoC(控制反转):传统方式是你自己 new 对象 → IoC 是容器给你对象。前端类比:依赖注入 ≈ React 的 Context / Props drilling 的相反模式——组件不自己找依赖,依赖被"注入"进来。
application.properties / application.yml:所有配置在这里——端口、数据库连接、日志级别等。
🎨 生活类比
类比理解
Spring Boot 像全配置的精装厨房——灶台(嵌入式 Tomcat)、锅碗瓢盆(Starter 依赖)、调料架(自动配置)全部到位。你只需要说"我要炒个菜"(写个 Controller),不用先砌灶台(装 Tomcat)、拉煤气管道(配 web.xml)、买锅(引入 Jackson)。 IoC 容器像餐厅的传菜系统——厨师(你的代码)不需要自己去仓库找食材,只需要在窗口喊一声"我需要 UserService"(@Autowired),传菜员(容器)就给你送来。你不需要知道食材从哪买、怎么存的。 @RestController 像餐厅的前台服务员——接收客人的点单(HTTP 请求),转达给厨房(Service),把菜端回去(返回 JSON)。
✏️ 动手练习
练习 1
用 Spring Initializr 创建一个 Spring Boot 项目。选 Maven、Java 17、Spring Web 依赖。导入 IDEA,运行并访问 localhost:8080。
<details> <summary>💡 查看提示</summary>
https://start.spring.io —— 选 Maven Project, Java, 3.x 版本。Dependencies 加 Spring Web。下载后解压,IDEA 里 Open 这个文件夹(Maven 会自动下载依赖)。
</details>
练习 2
写一个 @RestController,加 3 个端点:① GET /api/health 返回 {"status":"ok"} ② GET /api/time 返回当前服务器时间 ③ POST /api/echo 把请求体原样返回。
<details> <summary>💡 查看提示</summary>
使用 @PostMapping 和 @RequestBody String body。返回 JSON 可以用 Map 或创建一个 record 类。
</details>
练习 3
在 application.properties 里修改服务器端口为 9090,重启验证。再加一行 server.servlet.context-path=/api 观察 URL 变化。
<details> <summary>💡 查看提示</summary>
两行配置:server.port=9090 和 server.servlet.context-path=/api。加了 context-path 后,所有 URL 前缀都会加上 /api。
</details>
✅ 自检站
<details> <summary><strong>IoC(控制反转)是什么意思?传统方式和 IoC 方式创建对象的区别?</strong></summary>
传统方式:你需要一个 UserService → 你在代码里 UserService s = new UserService()。IoC:你把"我需要 UserService"告诉 Spring 容器(通过 @Autowired 或构造器注入),容器帮你创建并注入。控制反转的意思:创建对象的控制权从你的代码"反转"给了框架。好处:解耦、方便测试(可以注入 Mock)、统一管理对象生命周期(单例/原型)。
</details>
<details> <summary><strong>@RestController 和 @Controller 有什么区别?</strong></summary>
@Controller 用于传统的 MVC(返回视图名如 "index.html")。@RestController = @Controller + @ResponseBody —— 每个方法的返回值直接写入 HTTP 响应体,通常序列化为 JSON。做 REST API 只用 @RestController。
</details>
<details> <summary><strong>Spring Boot 的 starter 是什么?spring-boot-starter-web 帮你做了什么?</strong></summary>
starter 是一组预配置的依赖集合(Maven BOM)。spring-boot-starter-web 包含:spring-web(HTTP 处理)、spring-webmvc(MVC 框架)、嵌入式 Tomcat、Jackson(JSON 序列化)、Hibernate Validator(参数校验)。你只需一个依赖就拥有了完整的 Web 开发栈,不用担心版本冲突。
</details>