Spring Boot入门教程:60分钟快速上手

半夜部署日记
2025-12-17 10:01
阅读 1313

上周五晚上九点半,我瘫在工位上,耳机里循环播放着Lo-fi beats(边写代码边听音乐是我雷打不动的仪式感),屏幕右下角弹出一条钉钉消息:“小张,下周一要上线一个内部审批流程的小工具,后端用 Java 吧,Python 那套我们运维不熟,别搞花里胡哨的了。”

我盯着这句话愣了三秒——不是吧?我这个 Python 写了快五年的老码农,突然被要求切 Java?而且还是 Spring Boot?说实话,虽然我知道 Spring Boot 是 Java 生态的“亲儿子”,但之前一直觉得它太重、配置太繁琐,远不如 Flask 或 FastAPI 来得清爽。可架不住领导一句话+上海租房压力大啊,跳槽是不可能现在跳的,只能硬着头皮上。

于是,那个周末我没去徐家汇喝咖啡,也没刷 LeetCode,而是泡在 B 站和官方文档里,花了整整两天,终于把一个能跑的 Spring Boot 服务搭起来了。今天这篇笔记,就是我从零到部署的血泪总结——60 分钟快速上手 Spring Boot,希望能帮到同样被“临时抓壮丁”的兄弟们。


为什么是 Spring Boot?(以及为什么不是 Python)

先说清楚背景:我们团队主语言其实是 Python,日常用 FastAPI + SQLAlchemy 做内部工具,效率高、开发爽。但问题来了——运维同学只认 Java。他们有一套成熟的 CI/CD 流程、监控告警体系、JVM 调优经验,全都是围绕 Java 生态构建的。你扔个 Python 服务过去,人家直接摆手:“这玩意儿内存泄漏了谁背锅?GC 怎么调?Prometheus 指标怎么暴露?”

更惨的是,去年双11期间,我们一个 Python 服务因为 GIL 和线程池配置不当,导致 CPU 打满,差点拖垮整个审批链路。从此以后,领导对“非 JVM 语言”就格外警惕。

所以这次,明知道 Spring Boot 启动慢、内存吃得多,也得咬牙上。好在 Spring Boot 真的比老 Spring 简单太多——自动配置、内嵌 Tomcat、starter 依赖管理,一套组合拳下来,开发体验其实没那么痛苦。


环境准备:别被 Maven 劝退

首先装 JDK 17(别问为什么,问就是公司统一版本),然后装 Maven。我知道很多 Pythoner 看到 pom.xml 就头大,觉得远不如 requirements.txt 清爽。但 Maven 的依赖传递和版本锁定机制,在大型项目里是真的稳。

# 检查环境
java -version
mvn -v

然后去 Spring Initializr 快速生成项目骨架。这里我选了:

  • Language: Java
  • Spring Boot: 3.2.x
  • Dependencies: Spring Web, Spring Data JPA, H2 Database(开发用), Lombok

下载 zip 解压,导入 IDEA(别用 Eclipse,求你了)。这时候你会发现项目结构很清晰:

src/
├── main/
│   ├── java/com/example/demo/
│   │   ├── DemoApplication.java
│   │   ├── controller/
│   │   ├── service/
│   │   └── repository/
│   └── resources/
│       ├── application.properties
│       └── static/ (前端资源)
└── test/

对比 Flask 的 app.py 一文件搞定,Spring Boot 确实“重”了些,但这种分层结构在团队协作时优势巨大——Controller 只管接口,Service 处理逻辑,Repository 对接数据库,各司其职,避免“面条代码”。


第一个接口:Hello World 也不简单

新建一个 HelloController.java

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, 公务员考试人!";
    }
}

运行 DemoApplication.main(),访问 http://localhost:8080/hello,看到输出就算成功。

但等等!你以为这就完了?天真。在真实项目里,光返回字符串远远不够。我们得考虑:

  • 返回 JSON 格式(前端才不 care 你返回啥字符串)
  • 统一响应结构(code/msg/data)
  • 异常处理(别让用户看到 500 Internal Error)

于是我立刻建了个通用响应类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ApiResponse<T> {
    private int code;
    private String msg;
    private T data;

    public static <T> ApiResponse<T> success(T data) {
        return new ApiResponse<>(200, "success", data);
    }
}

Lombok 的 @Data 真是救命稻草,省了 getter/setter 的 boilerplate code。要是在 Python 里,我可能就直接 return jsonify(...) 了,但在 Java 世界,类型安全和结构清晰更重要——毕竟我们可是要对接政务系统的人(没错,考公路上的觉悟必须高)。


数据库集成:JPA vs MyBatis,我站 JPA

产品提需求:“审批记录要存数据库,字段包括申请人、事由、状态、创建时间。”

我第一反应是建表+写 SQL。但在 Spring Boot 里,用 JPA(Java Persistence API)配合 Hibernate,可以做到 对象关系映射(ORM),几乎不用写 SQL。

定义实体类 ApprovalRecord.java

@Entity
@Table(name = "approval_records")
@Data
public class ApprovalRecord {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String applicant;
    private String reason;
    private String status; // PENDING/APPROVED/REJECTED
    private LocalDateTime createdAt;
}

再写个 Repository:

public interface ApprovalRecordRepository extends JpaRepository<ApprovalRecord, Long> {
    List<ApprovalRecord> findByApplicant(String applicant);
}

瞧瞧,连查询方法都靠命名约定自动生成!这不比手写 SQL 香?当然,复杂查询还是得用 @Query 注解写 JPQL,但 80% 的场景够用了。

吐槽时间:测试同事看到我用 H2 内存数据库做单元测试,一脸不屑:“这和 MySQL 能一样吗?” 我默默改成了 Testcontainers 启动真实 MySQL 容器——卷,是程序员的基本修养。


配置管理:别再 hardcode 了!

开发时用 H2,测试用 MySQL,生产用阿里云 RDS——不同环境数据库地址、密码都不同。Spring Boot 的 application.properties 支持 profile 切换:

# application-dev.properties
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-db:3306/approval?useSSL=false
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASS}

启动时加 -Dspring.profiles.active=prod 即可切换。强烈建议所有敏感信息通过环境变量注入,别把密码提交到 Git——上次实习生这么干,被运维拉去喝茶了。


性能与生产部署:别让 JVM 成为你的短板

Spring Boot 应用启动慢、内存占用高是事实。我在本地跑起来要 3s,吃掉 500MB 内存。但生产环境可以通过以下优化缓解:

  1. GraalVM Native Image:编译成 native binary,启动 < 100ms,内存 < 100MB。不过兼容性还有坑,慎用。
  2. JVM 参数调优
    java -Xms256m -Xmx512m -XX:+UseG1GC -jar demo.jar
    
  3. Actuator 监控:加 spring-boot-starter-actuator,暴露 /actuator/health/actuator/metrics,方便运维接入 Prometheus。

另外,务必开启 HTTPS!政务相关系统对安全要求极高。Spring Security 配置几行就能搞定:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
        return http.build();
    }
}

开发心得:从 Pythoner 视角看 Spring Boot

作为一个长期写 Python 的人,用 Spring Boot 最大的感受是:约束带来自由

Python 太灵活了,同一个功能十个人能写出十种风格。而 Spring Boot 强制你遵循约定(比如 application.properties@RestController、分层架构),反而让代码更容易维护、交接。尤其在政府或国企项目中,人员流动大,规范比炫技重要一万倍。

当然,也有水土不服的地方:

维度 Python (FastAPI) Spring Boot
开发速度 ⚡ 极快(动态类型) 中等(编译+类型检查)
启动时间 < 1s 2~5s
内存占用 50~100MB 300~800MB
团队协作 依赖 Code Review 结构天然清晰
运维友好度 低(需额外封装) 高(成熟生态)

如果你在互联网公司追敏捷,Python 更香;但如果你目标是考公、进国企、做政务系统——Spring Boot 几乎是必选项。它稳定、规范、生态完善,领导看了安心,运维看了放心。


最后:60 分钟真的够吗?

老实说,纯新手 60 分钟只能跑通 Hello World。但如果你有后端基础(比如熟悉 RESTful、ORM、MVC),加上我这篇“踩坑指南”,2 小时内做出一个带数据库的 CRUD 服务完全可行

我自己从零开始,到把审批工具部署到公司 K8s 集群,总共花了 16 小时。中间踩过这些坑:

  • 忘记加 @EnableJpaAuditing 导致 createdAt 不自动填充
  • application.properties 里写错 datasource URL,报 Communications link failure
  • 生产环境没配 connection pool,高并发时数据库连接耗尽

但每解决一个 Bug,就离“上岸”更近一步。毕竟,会 Spring Boot 的程序员,在体制内 IT 岗招聘里,简历通过率至少翻倍


结语:写代码,也写人生

现在每天下班回家,我一边刷行测题,一边想着明天要优化的 Spring Boot 接口。上海的房租贵得离谱,但想到未来能在体制内安稳 coding,不用再为 35 岁焦虑,就觉得眼前这点折腾算不了什么。

技术没有高低贵贱,Python 和 Java 都是工具。关键是你能不能用它解决问题,拿到想要的生活。

共勉。下次更新:《Spring Security + JWT 实现政务系统登录认证》。

(P.S. 如果你觉得这篇对你有帮助,点个赞吧!你的支持是我加班写博客的动力 😅)

评论 0

最热最新
暂无评论
半夜部署日记Lv.1
0
影响力
0
文章
0
粉丝