60分钟,从零跑通你的第一个 Spring Boot 应用

API打磨师
2026-05-11 20:00
阅读 1344

去年双11大促前夜,我还在机房和运维兄弟对线 Redis 缓存击穿的问题。那会儿刚来京东不久,凌晨三点,咖啡已经续了第五杯,脑子里只剩一个念头:要是能早点搞明白 Spring Boot 的自动装配机制,这破 bug 根本不会上线。现在嘛,在这儿待了三年多,经历过好几轮大促流量洪峰的“洗礼”,也终于敢说一句:Spring Boot 这玩意儿,真没那么玄乎。

最近在考虑换个环境——不是公司不好,实在是天天写一样的 CRUD 接口,都快长蘑菇了。跳槽前得补点新东西,顺便把老本行再夯实一下。刚好有个刚转后端的朋友问我:“哥,Spring Boot 到底咋入门?我看教程一堆,越看越懵。” 我一拍大腿:行,那就写个真正给新手看的教程,不整那些虚头巴脑的理论,就讲怎么60分钟内跑起来、改起来、理解起来

别担心,就算你之前主要写 Python(比如我司不少做 RAG 的同事就是),也能轻松上手。咱们今天的目标很明确:不做 API 搬砖人,要做懂原理的开发者


为什么是 Spring Boot?不是 Flask 或 FastAPI?

先说清楚背景。我在京东主要负责商品中心的后端服务,高并发、低延迟是基本要求。早年我们用过原始的 Spring + XML 配置,那叫一个酸爽——改个数据库连接,要翻三份配置文件,重启一次服务等十分钟,产品经理站你背后都能把你盯出 PTSD。

Spring Boot 的核心价值就俩字:约定优于配置。它把最常见的场景(比如连 MySQL、起 Web 服务、打日志)都给你封装好了,你只需要告诉它“我要干啥”,它自动帮你配好“怎么干”。这对我们这种天天被 deadline 追着跑的人来说,简直是救命稻草。

举个真实例子:上周五晚上九点,产品临时加需求,要加个商品标签搜索接口。我新建个 Spring Boot 项目,20 分钟写完逻辑,测完提测——这种速度,在老 Spring 时代根本不敢想。


环境准备:别在第一步就劝退自己

很多人卡在第一步:JDK 装不对、Maven 配不好、IDEA 启动报错……别慌,咱们简化到极致。

最低配置清单

  • JDK 17(别用 8 了,虽然还能跑,但新特性真香)
  • 一个顺手的 IDE(IntelliJ IDEA 社区版完全够用)
  • 网络能访问 Maven 中央仓库(或者你有公司私有仓库)

🚨 血泪教训:千万别用 Eclipse!我见过实习生坚持用 Eclipse 写 Spring Boot,三天没跑起来项目,最后哭着换 IDEA。这不是歧视,是效率问题。

如果你习惯用 Python,可能会觉得 Java 生态有点“重”。但相信我,一旦跑起来,它的稳定性和生态成熟度会让你爱上它——尤其是在处理高并发场景时。


第一步:5分钟创建项目(比 pip install 还快)

打开 https://start.spring.io ——这是官方脚手架,相当于 Python 的 cookiecutter,但更傻瓜。

填几个关键信息:

  • Project: Maven (Gradle 也行,但我司统一用 Maven)
  • Language: Java
  • Spring Boot: 3.2.x(选最新的稳定版)
  • Group / Artifact: 随便填,比如 com.example.demo
  • Dependencies: 只勾选 Spring Web

点击 “Generate”,下载 zip 包,解压导入 IDEA。

💡 小技巧:IDEA 里可以直接用 Spring Initializr 插件创建,不用开网页。

导入后,你会看到一个 DemoApplication.java,里面就两行代码:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

别小看这俩注解,@SpringBootApplication 是 Spring Boot 的灵魂,它等于:

  • @Configuration(我是配置类)
  • @EnableAutoConfiguration(请自动给我配好)
  • @ComponentScan(扫我这个包下的所有组件)

直接右键 run! 控制台输出 Tomcat started on port(s): 8080 就表示成功了。没报错?恭喜,你已经超过 30% 的初学者了!


第二步:写个接口,告别 Hello World

光跑起来没意思,咱们写个真实的接口。比如,模拟一个简单的商品查询。

新建一个 ProductController.java

@RestController
@RequestMapping("/api/products")
public class ProductController {

    @GetMapping("/{id}")
    public Map<String, Object> getProduct(@PathVariable Long id) {
        Map<String, Object> product = new HashMap<>();
        product.put("id", id);
        product.put("name", "Spring Boot 入门教程");
        product.put("price", 0.0); // 免费的,良心!
        return product;
    }
}

启动应用,浏览器访问 http://localhost:8080/api/products/123,应该能看到 JSON 返回。

这里几个关键点:

  • @RestController = @Controller + @ResponseBody,直接返回 JSON
  • @GetMapping 对应 HTTP GET 方法
  • @PathVariable 提取 URL 中的变量

是不是比 Flask 还简单?Flask 得手动 jsonify(),这里全自动序列化。


第三步:连数据库,告别内存数据

真实项目肯定要持久化。咱们用 H2(内存数据库,不用装 MySQL 也能跑)。

pom.xml 里加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

然后在 application.properties 里加配置:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.hibernate.ddl-auto=create-drop
spring.h2.console.enabled=true

建个实体类 Product.java

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double price;
    // getter/setter 省略(IDEA 可自动生成)
}

再建个 Repository:

public interface ProductRepository extends JpaRepository<Product, Long> {}

最后在 Controller 里注入使用:

@Autowired
private ProductRepository productRepo;

@GetMapping
public List<Product> listProducts() {
    return productRepo.findAll();
}

重启,访问 /api/products,空列表。你可以通过 H2 控制台(/h2-console)手动插入数据测试。

🔥 生产经验:线上绝不用 ddl-auto=create-drop!我们用 Flyway 做数据库版本管理,每次上线前 SQL 必须经过 DBA 审核——去年就有同事忘了改这个配置,上线清空了测试库,被拉去开了复盘会。


关于 Python 和 RAG:其实我们都在融合

你可能纳闷:文章开头提了 Python 和 RAG,咋还没出现?

其实我们团队最近就在搞一个混合架构:用 Python 写 RAG(检索增强生成)服务,用 Spring Boot 做主业务网关

比如用户搜“iPhone 15 电池续航”,前端请求到我们的 Spring Boot 网关,网关调用内部的 Python RAG 服务(通过 gRPC 或 HTTP),拿到增强后的结果,再整合商品数据返回。

为什么这么干?因为:

  • Spring Boot 处理高并发 API 稳定可靠
  • Python 在 NLP 和向量检索上生态无敌(LangChain、LlamaIndex 等)

所以别觉得学 Spring Boot 是放弃 Python。现代后端开发,早就不是非此即彼了。我在京东的日常,经常一边看 Java GC 日志,一边调试 Python 的 embedding pipeline。


性能与生产:别只在 localhost 上跑

新手常犯的错误:本地跑得飞起,一上 K8s 就崩。

分享几个我们踩过的坑:

问题 现象 解决方案
内存溢出 POD 频繁 OOMKilled 设置 -XX:MaxRAMPercentage=75.0,别让 JVM 吃满容器内存
启动慢 健康检查超时被杀 readinessProbelivenessProbe 区分就绪和存活
日志丢失 容器重启后找不到日志 日志必须输出到 stdout,由 Fluentd 采集

我们现在的标准部署 YAML 都带资源限制:

resources:
  requests:
    memory: "512Mi"
    cpu: "500m"
  limits:
    memory: "1Gi"
    cpu: "1000m"

还有,永远不要在代码里写死配置!用 @Value("${app.timeout:5000}"),配合 ConfigMap 注入。


最后:60分钟只是开始

写到这里,刚好一小时。你已经:

  • 创建了 Spring Boot 项目
  • 写了 REST API
  • 连了数据库
  • 了解了生产注意事项

但 Spring Boot 的深水区才刚开始:异步处理、缓存集成(Redis)、分布式事务、链路追踪……这些才是大促期间保命的关键。

不过没关系,每个大神都是从 Hello World 开始的。我第一次写 Spring Boot 时,连 @Autowired 是啥都不知道,现在也能在双11值班表上排主力了。

如果你看完这篇还是一头雾水——别急,关掉教程,亲手敲一遍代码。编程这事儿,看十遍不如跑一次。遇到报错?复制错误信息搜,Stack Overflow 上八成有答案。

最后送句话:技术没有高低贵贱,Java、Python、Go,工具而已。重要的是解决问题的能力。我现在看 RAG 论文,也在学 LangChain;你写 Spring Boot,也可以顺便看看 Kubernetes Operator。真正的工程师,永远保持好奇

哦对了,如果这篇文章帮到了你,欢迎点赞转发——毕竟,我也在准备面试,简历上能写“技术影响力”嘛 😏


作者:某东五年后端,经历过三次双11 P0 故障抢救,现寻求新机会。深夜码字不易,如有错漏,欢迎指正。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝