Spring Boot入门教程:60分钟快速上手?我信了,结果通宵到凌晨三点
作者:一个试遍所有AI编程工具、最终在Cursor里安了家的后端码农。坐标北京,每天地铁1小时通勤,最近沉迷Rust源码不可自拔——但今天,我们不聊Rust,聊聊那个让我上周五晚上差点把MacBook砸了的Spring Boot。
事情是这样的。
上周四下午,产品经理小李(对,就是那个总说“这个需求很简单”的小李)突然冲进我们工位区:“兄弟们!下周一上线一个内部管理后台,就一个表单+列表,用Java写,Spring Boot就行,你们不是都会吗?”
我看了看日历——周五下班前要联调,周日上线。而我当时脑子里还在跑着Rust的生命周期检查器,连pom.xml长啥样都快忘了。
更尴尬的是,我们组之前主力是Python + FastAPI,Java项目基本停了两年。现在临时抱佛脚?行吧,谁让我是个打工人呢。
为什么不用Python?因为“架构规范”啊!
说实话,如果让我选,我肯定上FastAPI:几行代码搞定REST API,自动文档,异步支持,调试爽到飞起。但公司去年搞了个“技术栈收敛”运动,规定所有新后端服务必须用Spring Boot——理由是“便于统一监控、链路追踪和人才复用”。
呵,人才复用?我们组三个Python老手,硬生生被逼成了“Java萌新”。
不过吐槽归吐槽,活儿得干。于是周五早上,我泡了杯冰美式,打开IntelliJ IDEA(别问,问就是公司标配),准备60分钟速成Spring Boot。
结果?60分钟只够把项目建起来,连Hello World都没跑通。
踩坑实录:从“60分钟”到“6小时”的心路历程
第一坑:版本地狱
Spring Boot版本、Java版本、Maven插件、依赖库……光是这几个东西就能凑一桌麻将。我本地装的是Java 17,但公司CI环境是Java 11。结果本地跑得好好的,一推GitLab CI直接炸:
Unsupported class file major version 61
查了半天才知道是Java 17编译的class文件(major version 61)在Java 11(max 55)上跑不了。最后在pom.xml里强制指定:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
教训:别信官网“开箱即用”,先问清楚生产环境版本!
第二坑:配置文件玄学
Spring Boot号称“约定优于配置”,但当你需要连数据库、配Redis、开Actuator监控时,application.yml能写到你怀疑人生。
比如我想连个MySQL,按网上教程写了:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: 123456
结果启动报错:
The server time zone value 'йʱ' is unrecognized...
哦,原来MySQL驱动8.0以后要显式指定时区。改完还得加useSSL=false、serverTimezone=Asia/Shanghai……一顿操作猛如虎,配置比业务代码还长。
相比之下,Python里一行DATABASE_URL="mysql://..."就完事了,真香。
第三坑:自动装配的“黑盒”
Spring Boot最牛也最烦的,就是自动装配(Auto-configuration)。它默默帮你做了很多事,但一旦出问题,你根本不知道是哪一层崩了。
比如我加了个@RestController,返回JSON,结果中文全变乱码。查了一圈才发现,Spring Boot默认没配UTF-8的HttpMessageConverter。最后得手动加:
@Bean
public HttpMessageConverters customConverters() {
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
return new HttpMessageConverters(stringConverter);
}
当时真的想砸电脑:这玩意儿在FastAPI里默认就是UTF-8好吗!
真·60分钟上手指南(基于血泪经验)
既然踩了这么多坑,干脆整理个真正能60分钟跑起来的路径。以下是我重开项目后总结的步骤:
1. 创建项目(5分钟)
用 start.spring.io 在线生成,选好:
- Java 11(适配公司环境)
- Spring Boot 2.7.x(别用3.x,兼容性差)
- 依赖:Spring Web, Spring Data JPA, MySQL Driver, Lombok
下载解压,IDEA导入,搞定。
2. 写个Hello World(10分钟)
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot! (终于跑起来了)";
}
}
运行Application.java主类,访问 http://localhost:8080/hello。
Tip:如果端口被占,改
application.yml:server: port: 8081
3. 接数据库(20分钟)
建个实体类:
@Entity
@Table(name = "users")
@Data // Lombok注解,省getter/setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
写个Repository:
public interface UserRepository extends JpaRepository<User, Long> {}
Controller里注入:
@RestController
@RequiredArgsConstructor // Lombok,自动生成构造函数注入
public class UserController {
private final UserRepository userRepository;
@PostMapping("/users")
public User createUser(@RequestBody User user) {
return userRepository.save(user);
}
}
别忘了配application.yml里的数据库连接(带时区!):
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
jpa:
hibernate:
ddl-auto: update # 开发用,别上生产!
show-sql: true
4. 测试 & 调试(15分钟)
用Postman或curl测:
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"name":"张三","email":"zhangsan@example.com"}'
看到返回JSON,说明通了!
5. 打包部署(10分钟)
运行:
./mvnw clean package
生成target/*.jar,直接运行:
java -jar target/demo-0.0.1-SNAPSHOT.jar
和Python比,到底值不值得?
为了客观,我拿同样功能对比了FastAPI:
| 维度 | Spring Boot | FastAPI (Python) |
|---|---|---|
| 代码量 | ~50行(含配置) | ~15行 |
| 启动速度 | 3-5秒 | <1秒 |
| 内存占用 | ~300MB | ~50MB |
| 学习曲线 | 陡峭(需懂IoC、AOP、JPA等) | 平缓(函数即接口) |
| 生产监控 | 成熟(Micrometer + Prometheus) | 需额外集成 |
| 团队协作 | 强类型,重构安全 | 动态类型,需严格测试 |
结论:如果你追求开发速度、原型验证,Python完胜;但如果是大型企业级系统,需要强事务、高并发、完善生态,Spring Boot依然是王者。
最后:别信“60分钟上手”
标题党害死人。真正的“上手”不是跑个Hello World,而是能独立设计接口、处理异常、连数据库、写单元测试、打包部署。
我花了整整一个周末,才把那个内部后台搞定。上线那天,运维老王还吐槽:“又是Java?内存又爆了!” —— 好吧,至少没出P0事故。
现在回看,Spring Boot确实强大,只是门槛高了点。就像我最近读的《Spring实战》(第6版)里说的:“Spring的复杂性,是为了应对现实世界的复杂性。”
至于我?下周继续研究Rust去了。毕竟,在Java里写Optional.ofNullable().orElse()的时候,我真的会想念Python的or和Rust的Option……
附:给新人的忠告
- 别死磕官方文档,先跑通再深挖
- 遇到报错,直接搜错误信息 + Spring Boot版本
- 多用Lombok,少写样板代码
- 生产环境别用
ddl-auto: update,会丢数据! - 如果公司允许,尽量争取用Kotlin写Spring Boot,能少写一半代码
好了,地铁到站了,该搬砖了。希望这篇血泪史能帮你少熬一个通宵。

评论 0