Spring Boot基础-1:用5分钟搭建第一个REST API应用(含深度原理解析)

📌 系列说明 :本文是《Spring Boot从入门到底层原理》20篇系列的开篇之作

  • 适合人群:Java初学者、从传统Spring迁移的开发者、希望快速上手微服务的工程师。
  • 核心目标:不仅教会你"怎么写",更要让你明白"为什么这么写"。
  • 版本基准:Spring Boot 3.5.x + JDK 17+ (2026年主流标准)。

一、Spring Boot 到底是什么?

在开始敲代码之前,我们必须先厘清一个概念:Spring Boot 不是 Spring,但它又是 Spring 的灵魂。

1.1 官方定义 vs 通俗解释

  • 官方定义:Spring Boot 是一个用于简化 Spring 应用初始搭建以及开发过程的框架。它基于"约定优于配置"(Convention over Configuration)的理念,让你能迅速生产独立的、生产级的 Spring 应用。
  • 通俗解释 : 如果把 Spring 比作一套豪华但复杂的乐高积木 (功能强大,但你需要自己看说明书拼底座、找零件、配颜色); 那么 Spring Boot 就是预组装好的乐高套装(底座搭好了,常用零件配齐了,说明书简化为"开箱即用")。你只需要关注你想拼的那部分(业务逻辑),剩下的繁琐工作它都帮你自动完成了。

1.2 Spring Boot 能做什么?(核心能力)

在现代 Java 开发中,Spring Boot 主要承担以下四大核心角色:

✅ 1. 极速启动与零配置(Auto-Configuration)

  • 痛点 :以前写 Spring 需要写大量的 XML 配置(applicationContext.xml)或复杂的 Java Config 类来配置数据源、事务管理器、MVC 视图解析器等。
  • Boot 方案 :它通过自动配置机制 ,根据你引入的依赖(如 spring-boot-starter-web),自动猜测并配置好所有需要的 Bean。 例子:只要你引入了 Web 依赖,它自动配置 Tomcat 和 Spring MVC;引入了 MySQL 依赖,它自动配置 DataSource。

✅ 2. 内嵌服务器(Embedded Server)

  • 痛点:传统开发需要单独安装 Tomcat/Jetty,打包成 WAR 包部署到外部服务器,环境一致性难保证。
  • Boot 方案 :将 Tomcat、Jetty 或 Undertow 直接打包进 JAR 文件 中。 结果:你的应用就是一个可执行的 JAR 包,java -jar app.jar 即可运行,无需额外安装 Web 服务器。这是云原生和容器化(Docker/K8s)的基石。

✅ 3. 生产级监控与管理(Actuator)

  • 痛点:应用上线后,想知道健康状态、内存使用、线程池情况,往往需要自己写代码暴露接口。
  • Boot 方案 :内置 Spring Boot Actuator ,一键开启 /health(健康检查)、/metrics(指标监控)、/info(应用信息)等端点,轻松对接 Prometheus、Grafana 等监控体系。

✅ 4. 强大的生态整合(Starters)

  • 痛点:整合 Redis、RabbitMQ、Elasticsearch 时,需要查阅大量文档配置依赖版本,容易冲突。
  • Boot 方案 :提供一系列 Starters (起步依赖),如 spring-boot-starter-data-redis。只需引入一个依赖,所有相关的库、版本兼容性、默认配置全部搞定。

1.3 为什么它是微服务的首选?

在 2026 年的今天,Spring Boot 已成为微服务架构的事实标准,原因如下:

  1. 轻量级:每个微服务都是独立的可执行 JAR,部署灵活。
  2. 解耦:通过 Starter 隔离依赖,避免"依赖地狱"。
  3. 云原生友好:天然支持 Docker 容器化,配合 Kubernetes 实现弹性伸缩。
  4. 生态统一:与 Spring Cloud(服务治理)、Spring Security(安全)、Spring Data(数据访问)无缝集成。

💡 一句话总结:Spring Boot 让 Java 开发者从"配置工程师"回归到"业务开发者",将开发效率提升了 10 倍以上。


二、环境准备(2026年最新要求)

工欲善其事,必先利其器。Spring Boot 3.x 对运行环境有硬性要求。

2.1 核心依赖版本

组件 最低版本要求 推荐版本 (2026) 说明
JDK 17 21 (LTS) Spring Boot 3.x 彻底放弃 Java 8/11,必须 17+
Spring Boot 3.0.0 3.4.x / 3.5.x 选择最新稳定版,享受性能优化
构建工具 Maven 3.6+ Maven 3.9+ 或 Gradle 8.x
IDE IDEA 2022+ IDEA 2025/2026 获得最好的代码提示和 Spring 辅助功能

2.2 验证环境

打开终端(Terminal),输入以下命令确认环境就绪:

bash 复制代码
# 检查 JDK 版本(必须 >= 17)
java -version
# 输出示例: openjdk version "21.0.2" ...

# 检查 Maven 版本
mvn -v

三、项目初始化:三种方式对比

方式一:Spring Initializr 网页版(推荐新手)

访问 start.spring.io,配置如下:

  • Project: Maven
  • Language: Java
  • Spring Boot: 3.5.11 (或最新 Stable)
  • Packaging: Jar
  • Java: 17 (或 21)
  • Dependencies (关键步骤):
    • Spring Web (构建 REST API 必备)
    • Spring Boot DevTools (开发热部署,提升效率)
    • Lombok (简化代码,可选但推荐)

点击 GENERATE 下载 ZIP 包,解压后用 IDEA 打开。

方式二:IDEA 内置初始化(最快捷)

  1. File -> New -> Project
  2. 左侧选择 Spring Initializr
  3. 后续步骤同网页版,直接在 IDE 内生成项目结构。

方式三:手动构建(理解原理后使用)

手动创建 pom.xml 和目录结构。(新手暂不推荐,易出错)


四、项目结构深度解析

生成后的项目结构看似简单,实则暗藏玄机:

text 复制代码
demo/
├── src/
│   ├── main/
│   │   ├── java/com/example/demo/
│   │   │   ├── DemoApplication.java    # 【核心】启动入口
│   │   │   └── controller/             # 存放控制器
│   │   └── resources/
│   │       ├── application.properties  # 配置文件
│   │       └── static/                 # 静态资源 (CSS/JS)
│   └── test/                           # 测试代码
├── pom.xml                             # 【核心】依赖管理
└── .gitignore

4.1 灵魂文件:DemoApplication.java

java 复制代码
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 【核心注解】Spring Boot 的魔法源头
@SpringBootApplication 
public class DemoApplication {

    public static void main(String[] args) {
        // 启动 Spring 应用上下文,并启动内嵌 Tomcat
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication 拆解(面试高频点): 它是一个组合注解,等同于以下三个注解的组合:

  1. @SpringBootConfiguration:标识这是一个配置类(等同于 @Configuration)。
  2. @EnableAutoConfiguration核心中的核心,开启自动配置机制,扫描 classpath 下的依赖并自动创建 Bean。
  3. @ComponentScan:自动扫描当前包及其子包下的 @Component, @Service, @Controller 等组件。

五、实战:编写第一个 REST API

5.1 创建控制器 (Controller)

controller 包下新建 HelloController.java

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

// @RestController = @Controller + @ResponseBody
// 表示该类的所有方法返回值直接序列化为 JSON/XML,而不是跳转视图
@RestController 
public class HelloController {

    /**
     * 处理 GET 请求:http://localhost:8080/hello
     */
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot 3.x! Welcome to 2026.";
    }

    /**
     * 返回复杂对象(自动转为 JSON)
     * 使用 Java 17+ Record 特性简化 DTO 定义
     */
    @GetMapping("/api/user")
    public UserDTO getUserInfo() {
        return new UserDTO("张三", 25, "Java Architect");
    }

    // 定义内部记录类 (Record)
    public record UserDTO(String name, int age, String role) {}
}

5.2 配置文件 (application.properties)

虽然 Spring Boot 提倡"零配置",但我们常需修改默认端口:

properties 复制代码
# 修改服务器端口,避免 8080 被占用
server.port=8080

# 设置应用名称(在 Actuator 监控中显示)
spring.application.name=demo-service

# 开启热部署(修改代码后自动重启,仅限开发环境)
spring.devtools.restart.enabled=true

六、运行与验证

6.1 启动应用

方法 A(推荐) :找到 DemoApplication.java 中的 main 方法,点击行号旁边的 绿色三角形 ▶️ ,选择 Run方法 B :右键 DemoApplication.java -> Run 'DemoApplication'方法 C :在终端执行 mvn spring-boot:run

成功标志: 控制台出现 Spring Boot 的 Banner 图案,且最后一行显示:

text 复制代码
Started DemoApplication in 2.145 seconds (process running for 3.012)

(注意:Spring Boot 3.x 启动速度极快,通常在 2-3 秒内)

6.2 接口测试

打开浏览器或 Postman/Curl:

  1. 测试字符串返回

    • 访问:http://localhost:8080/hello
    • 响应:Hello, Spring Boot 3.x! Welcome to 2026.
  2. 测试 JSON 返回

    • 访问:http://localhost:8080/api/user

    • 响应:

      json 复制代码
      {
        "name": "张三",
        "age": 25,
        "role": "Java Architect"
      }

七、新手必看:常见坑点与排错指南

❌ 坑点 1:端口被占用 (Port 8080 was already in use)

  • 现象 :启动报错 Web server failed to start. Port 8080 was already in use.
  • 原因:另一个 Java 进程或软件占用了 8080。
  • 解决
    1. 修改 application.propertiesserver.port=8081
    2. 或者杀掉占用进程(Windows: netstat -ano | findstr 8080 -> taskkill /PID xxx /F)。

❌ 坑点 2:javax vs jakarta 包名冲突

  • 现象 :代码报错 package javax.servlet does not exist
  • 原因 :Spring Boot 3.x 迁移到了 Jakarta EE 9+ ,所有 javax.* 包名已改为 jakarta.*
  • 解决
    • 检查导入语句,将 import javax.servlet... 改为 import jakarta.servlet...
    • 确保没有引入旧的 Servlet 依赖。

❌ 坑点 3:@Controller 返回了页面而不是 JSON

  • 现象:访问接口后,浏览器提示下载文件或显示字符串,而不是 JSON。
  • 原因 :使用了 @Controller 而非 @RestController,且未加 @ResponseBody
  • 解决 :REST 接口请始终使用 @RestController

❌ 坑点 4:IDEA 找不到 main 方法或无法运行

  • 解决
    1. 右侧 Maven 面板点击 刷新 (Reload)
    2. 等待右下角索引完成。
    3. 确认 src/main/java 目录被标记为 Sources Root(蓝色文件夹)。

八、核心原理图解:请求是如何处理的?

当你在浏览器输入 URL 后,Spring Boot 内部发生了什么?

graph LR A[浏览器请求] --> B(Tomcat 内嵌服务器) B --> C{DispatcherServlet
前端控制器} C --> D[HandlerMapping
寻找匹配的 Controller] D --> E[HelloController
执行业务逻辑] E --> F[HttpMessageConverter
对象转 JSON] F --> G[返回 HTTP 响应]
  1. Tomcat 接收请求。
  2. 转发给 DispatcherServlet(Spring MVC 的核心)。
  3. 根据 URL (/hello) 找到对应的 Controller 方法。
  4. 执行方法,返回字符串或对象。
  5. MessageConverter 自动将对象序列化为 JSON。
  6. 响应给客户端。

思考 :这一切都没有在 XML 中配置,是谁在幕后指挥?答案是下一篇我们要讲的 自动配置(Auto-Configuration)


九、本篇延伸思考

为了加深理解,请在阅读后思考以下问题(答案将在后续篇章揭晓):

  1. 如果我把 @SpringBootApplication 注解去掉,程序还能启动吗?会发生什么错误?
  2. 为什么我们不需要手动配置 DispatcherServletTomcat?它们是从哪里来的?
  3. Spring Boot 是如何知道要把 Java 对象转换成 JSON 格式的?

十、下篇预告

第 2 篇:《起步依赖(Starter)深度拆解:为什么引入一个依赖就够了?》

我们将深入 pom.xml 的黑盒:

  • 揭秘 spring-boot-starter-web 背后隐藏了哪些依赖?
  • 如何利用 mvn dependency:tree 分析依赖冲突?
  • 实战:手把手教你自定义一个专属的 Starter。

附录:完整代码清单

pom.xml (关键部分)

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.11</version> <!-- 推荐使用最新稳定版 -->
</parent>

<dependencies>
    <!-- Web 开发核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- 热部署工具 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
</dependencies>

GitHub 源码地址github.com/beatafu/spr...

🎉 恭喜你! 你已经完成了 Spring Boot 的第一步。不要停下,继续动手尝试修改代码,比如增加一个 POST 接口,或者修改返回的 JSON 结构。编程是练出来的,不是看出来的!

作者 :架构师Beata
日期 :2026年3月13日
声明 :本文基于网络文档整理,如有疏漏,欢迎指正。转载请注明出处。
互动:如有任何问题?欢迎在评论区分享

相关推荐
忧郁缭绕2 小时前
Spring Boot Pf4j模块化能力设计思考
java·spring boot·后端
iPadiPhone2 小时前
Spring Boot 核心注解全维度解析与面试复盘
java·spring boot·后端·spring·面试
彭于晏Yan2 小时前
Spring Cloud Stream使用
spring boot·后端·spring cloud
常利兵2 小时前
Kotlin 延迟初始化:lateinit与by lazy的华山论剑
spring boot·后端·状态模式
沙雕不是雕又菜又爱玩2 小时前
基于springboot的超市收银系统
java·spring boot·intellij-idea
l软件定制开发工作室3 小时前
Spring开发系列教程(32)——Spring Boot开发
java·spring boot·后端·spring
彭于晏Yan3 小时前
JsonProperty注解的access属性
java·spring boot
醇氧3 小时前
PowerPoint 批量转换为 PDF
java·spring boot·spring·pdf·powerpoint
gxy1990263 小时前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring