60分钟,从零跑通你的第一个 Spring Boot 应用
去年双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 吃满容器内存 |
| 启动慢 | 健康检查超时被杀 | 用 readinessProbe 和 livenessProbe 区分就绪和存活 |
| 日志丢失 | 容器重启后找不到日志 | 日志必须输出到 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