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)说明
JDK1721 (LTS)Spring Boot 3.x 彻底放弃 Java 8/11,必须 17+
Spring Boot3.0.03.4.x / 3.5.x选择最新稳定版,享受性能优化
构建工具Maven 3.6+Maven 3.9+或 Gradle 8.x
IDEIDEA 2022+IDEA 2025/2026获得最好的代码提示和 Spring 辅助功能

2.2 验证环境

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

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

# 检查 Maven 版本
mvn -v

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

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

访问 https://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 和目录结构。(新手暂不推荐,易出错)


四、项目结构深度解析

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

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

4.1 灵魂文件:DemoApplication.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

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 提倡“零配置”,但我们常需修改默认端口:

# 修改服务器端口,避免 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 图案,且最后一行显示:

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
    • 响应:
      {
        "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 内部发生了什么?

浏览器请求

Tomcat 内嵌服务器

DispatcherServlet
前端控制器

HandlerMapping
寻找匹配的 Controller

HelloController
执行业务逻辑

HttpMessageConverter
对象转 JSON

返回 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 (关键部分)

<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 源码地址
https://github.com/beatafu/spring-boot-learning.git

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值