Spring Boot入门教程:60分钟快速上手
上周五晚上,我正躺在沙发上刷 Rust 的 async/await 文档(别问,问就是“副业焦虑症”晚期),突然手机叮咚一声——产品经理发来消息:“哥,能不能帮我们搭个内部工具?就一个简单接口,查下订单状态就行,周一上线哈~”
我差点一口老血喷出来。这都快 9 点了,还“周一上线”?行吧,谁让我是那个“接外包搞副业的斜杠程序员”呢——白天在公司肝 Java 微服务,晚上回家撸 Rust,周末还得帮人写脚本换点奶茶钱。但说实话,这种小活儿用 Spring Boot 做,真的一小时搞定,连泡面都不用煮第二包。
所以今天这篇博客,就当是给刚入坑 Java 后端、或者像我一样被 PM 临时抓壮丁的兄弟们,一个 60 分钟速成指南。不讲大道理,只讲怎么跑起来、怎么别踩坑、怎么让产品闭嘴。
为啥又是 Spring Boot?
我知道,现在满大街都在吹 Go、Rust、Node.js,连我司新项目都开始试水 Quarkus 了。但现实是啥?Java + Spring Boot 依然是国内企业级产品的绝对主力。上周我们组 review 代码,12 个微服务里 9 个还是 Spring Boot。原因很简单:
- 生态成熟,starter 一打,集成 Redis、MySQL、Kafka 跟喝水一样
- 文档齐全,Stack Overflow 上随便搜都能找到解决方案
- 运维友好,JVM 调优虽然玄学,但至少有套路可循
而且,老板们信这个。你跟他说“用 Rust 写个高性能服务”,他一脸懵;你说“Spring Boot,稳得很”,他立马点头:“好,下周上线”。
第一步:别搞错 JDK 和 Maven
很多新人栽在这一步。Spring Boot 3.x 要求 JDK 17+,而你本地可能还在用 JDK 8(别笑,我们测试环境就有台服务器跑着 JDK 7,运维说“动了怕崩”)。
先确认你的环境:
java -version
# 推荐 OpenJDK 17 或 21
mvn -v
# Maven 3.6+ 足够
然后去 start.spring.io 生成项目。我一般这么选:
- Project: Maven
- Language: Java
- Spring Boot: 3.2.5(最新稳定版)
- Dependencies:
- Spring Web(必须)
- Spring Data JPA(如果你要连数据库)
- H2 Database(开发时用内存 DB,省事)
点击“Generate”,解压,导入 IDEA。这时候你的 pom.xml 里应该已经有 spring-boot-starter-web 了。
写个 Hello World 接口
新建一个类 OrderController.java:
@RestController
@RequestMapping("/api")
public class OrderController {
@GetMapping("/order/{id}")
public String getOrderStatus(@PathVariable Long id) {
// 实际项目这里会查数据库
return "Order " + id + " is SHIPPED";
}
}
然后启动 Application.java 主类。控制台看到 Tomcat started on port(s): 8080 就成了。
浏览器访问 http://localhost:8080/api/order/123,返回 Order 123 is SHIPPED —— 搞定!PM 要的功能完成了 50%。
🙃 自嘲一下:去年双11前,我就是因为少写了
@RestController,结果返回的是 HTML 页面而不是 JSON,被测试小姐姐追着问“你这接口是不是坏了”,当场社死。
接数据库?JPA + H2 开发超爽
产品肯定不会满足于写死的数据。假设我们要查真实订单,就得连数据库。
先在 application.properties 里配置:
# 开发时用 H2 内存数据库,重启就丢数据,但不用装 MySQL
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true # 开启 H2 控制台,浏览器访问 /h2-console
建个实体类:
@Entity
@Table(name = "orders")
public class Order {
@Id
private Long id;
private String status;
// getter/setter 省略
}
再写个 Repository:
public interface OrderRepository extends JpaRepository<Order, Long> {
}
最后改 Controller:
@Autowired
private OrderRepository orderRepo;
@GetMapping("/order/{id}")
public ResponseEntity<Order> getOrderStatus(@PathVariable Long id) {
return orderRepo.findById(id)
.map(ResponseEntity::ok)
.orElse(ResponseEntity.notFound().build());
}
启动后,访问 http://localhost:8080/h2-console,用默认配置登录,手动插条数据:
INSERT INTO orders (id, status) VALUES (123, 'SHIPPED');
再去调接口,就能拿到真实数据了。开发阶段用 H2,部署时切 MySQL,只需改配置,代码一行不动——这就是 Spring Boot 的优雅。
别忘了资源管理和异常处理
上线前,一定要考虑两点:
- 资源释放:数据库连接、线程池这些,Spring Boot 默认帮你管好了,但如果你自己开了线程或文件流,记得用
try-with-resources。 - 全局异常处理:别让 500 错误直接暴露给前端。
加个全局异常处理器:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoSuchElementException.class)
public ResponseEntity<String> handleNotFound(Exception e) {
return ResponseEntity.status(404).body("Order not found");
}
}
这样,当订单不存在时,返回友好的 404,而不是一串 Java stack trace。产品看了都说“专业”。
部署?打个 jar 就完事
Spring Boot 最爽的地方就是 fat jar。执行:
./mvnw clean package
生成 target/demo-0.0.1-SNAPSHOT.jar,直接扔到服务器:
nohup java -jar demo-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
配合 Nginx 反向代理,HTTPS 一配,产品验收通过,你又能回去继续研究你的 Rust 了。
性能和生产建议(血泪经验)
虽然这是入门教程,但咱干外包的,得对得起客户的钱。几点生产经验:
| 事项 | 开发环境 | 生产环境 |
|---|---|---|
| 数据库 | H2 内存 | MySQL / PostgreSQL |
| 日志 | console 输出 | 文件 + ELK |
| 配置 | application.properties | 外部 config + 加密 |
| 健康检查 | 无 | 加 /actuator/health |
| 监控 | 无 | Micrometer + Prometheus |
特别提醒:别在生产开 H2 控制台!我们有个实习生上线前忘关 spring.h2.console.enabled=true,结果被安全扫描扫出高危漏洞,运维差点把他电脑格式化。
结语:Java 还香吗?
写完这个小项目,总共花了 45 分钟。剩下的 15 分钟,我在想:现在大家都在追新语言,但 Spring Boot 对于快速交付 Java 产品,依然是最稳的选择。它可能不够“酷”,但它能让你准时下班、周末接单、副业搞钱。
当然,我也在学 Rust —— 不是为了取代 Java,而是为了在合适的场景用合适的工具。比如高性能网关、嵌入式系统,Rust 确实香。但如果你要做一个带用户管理、订单流程、支付回调的企业后台?Spring Boot + Java,依然是性价比之王。
所以,别被“技术潮流”带偏了节奏。能解决问题、按时交付、让产品闭嘴的代码,才是好代码。
好了,我去改我的 async Rust 了。如果这篇对你有帮助,欢迎点赞关注,下次聊聊《用 Rust 写 Web API 是不是真的比 Spring Boot 快》——不过那得等我先把副业需求做完 😅

评论 0