Spring Boot入门教程:60分钟快速上手?别信,但能跑起来
上周五下午4点半,刚泡好一杯枸杞茶准备迎接周末,组长突然在钉钉群里@我:“小张,下周三之前搞个简单的内部审批流程接口,就两个表,别整太复杂。” 我内心OS:又来?上次那个“简单配置页面”最后上线前改了七轮需求,测试还报了三个P0级Bug。
不过咱是国企程序员,主打一个情绪稳定(其实是躺平习惯了)。反正双休雷打不动,加班?不存在的。但活总得干完,于是翻出尘封已久的Spring Boot项目模板——没错,就是那个去年双11期间被临时抓壮丁做促销接口时用过的老伙计。
今天这篇技术分享,不整那些花里胡哨的“60分钟从零到部署”,毕竟咱们不是培训机构。我就以一个Vim党、两年工龄、最近偷偷学AI的普通后端开发视角,聊聊怎么快速把Spring Boot跑起来,并且别让运维半夜打电话骂你。
为啥又是Spring Boot?
说实话,我司技术栈有点“复古”。主力还是Spring MVC + MyBatis的老组合,XML配得比产品经理的需求文档还长。但新项目领导要求“拥抱现代化”,于是Spring Boot成了政治正确。
好处很明显:
- 自动配置省掉80%样板代码
- 内嵌Tomcat,不用求着运维搭环境
- Actuator监控开箱即用,线上排查少背锅
坏处?也明显。比如默认日志格式看着难受,Jackson序列化规则和老系统对不上,还有……启动慢得像我家楼下那台永远排不上队的咖啡机。
但架不住它生态成熟啊!我们组最近做的几个小工具(比如自动生成Excel报表、对接OA审批流),全靠Spring Boot快速交付。关键是真的不用加班——只要别碰上产品经理突发奇想。
起手式:别被“快速上手”骗了
网上教程总说“一行代码启动Web服务”,但现实是:你复制粘贴完,发现连数据库都连不上。所以我建议新手直接用 start.spring.io 生成项目骨架,至少依赖版本不会打架。
我常用的起步依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> <!-- 或 mybatis-spring-boot-starter -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
吐槽一句:JPA虽香,但我司DBA坚持用MyBatis,说是“SQL可控”。行吧,尊重传统。
配置文件:别再用application.properties了!
我知道很多教程还在教properties写法,但YAML才是人类友好的选择。特别是当你要配多环境、多数据源的时候,properties会把你逼疯。
我的标准 application.yml 结构:
spring:
datasource:
url: jdbc:mysql://prod-db:3306/approval?useSSL=false&serverTimezone=Asia/Shanghai
username: ${DB_USER}
password: ${DB_PASS}
jpa:
hibernate:
ddl-auto: validate # 生产环境绝对不能是create!
show-sql: false
management:
endpoints:
web:
exposure:
include: health,info,metrics # 别暴露所有端点!安全第一
logging:
level:
com.mycompany: INFO
org.springframework.web: WARN
重点来了:
- 数据库密码千万别硬编码!用环境变量或配置中心
ddl-auto: validate是底线,否则哪天误设成update,线上表结构被改了,你就等着写事故报告吧- Actuator只开放必要端点,上次隔壁组开了
shutdown,被安全扫描扫出来,整个部门通报批评……
接口设计:别一上来就RESTful
很多人觉得Spring Boot = REST API,但内部系统真不需要那么规范。我们审批流接口就两个核心方法:
@RestController
@RequestMapping("/api/v1/approval")
public class ApprovalController {
@Autowired
private ApprovalService approvalService;
// 提交审批
@PostMapping("/submit")
public ResponseEntity<?> submit(@RequestBody SubmitRequest req) {
try {
approvalService.submit(req);
return ResponseEntity.ok().build();
} catch (BusinessException e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
// 查询状态(给前端轮询用)
@GetMapping("/status/{taskId}")
public ApprovalStatus getStatus(@PathVariable String taskId) {
return approvalService.getStatus(taskId);
}
}
注意几点:
- 返回类型别用
Object,明确ResponseEntity更利于错误处理 - 异常统一用
@ControllerAdvice拦截,别在每个方法里写try-catch - 路径别带版本号
/v1—— 我们内部系统生命周期短,加版本纯属自找麻烦
数据库设计:主键别再用自增ID了!
这是血泪教训。去年有个表用 BIGINT AUTO_INCREMENT,结果分库分表改造时哭晕在厕所。现在我们新项目统一用 雪花算法(Snowflake)生成ID,虽然要自己维护workId,但长远看省事。
另外,字段命名全部小写+下划线,和MySQL保持一致。别搞什么驼峰,MyBatis映射时容易漏配,线上查不到数据又是一场灾难。
表结构示例(简化版):
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | BIGINT | 雪花ID |
| task_code | VARCHAR(32) | 审批单号,业务唯一 |
| status | TINYINT | 状态:0-待提交 1-审批中 2-通过 3-拒绝 |
| creator | VARCHAR(20) | 创建人工号 |
| create_time | DATETIME | 创建时间 |
性能与监控:别等上线才想起来
Spring Boot应用最容易犯的错就是:本地跑得飞快,一上生产就卡成PPT。原因往往是:
- 没关调试日志:
show-sql: true在生产环境等于自杀 - 连接池配置不合理:HikariCP默认最大连接20,高并发直接爆
- 没加缓存:重复查同一个审批状态,每次都打数据库
我们的生产配置片段:
spring:
datasource:
hikari:
maximum-pool-size: 50
minimum-idle: 10
connection-timeout: 3000
再加上Actuator的 /actuator/metrics,配合Prometheus+Grafana,CPU、内存、请求延迟一目了然。运维大哥看了都说好,再也不用半夜打电话问“是不是你们程序又OOM了?”
部署:Docker是底线
别再手动传jar包了!写个Dockerfile,一行命令搞定:
FROM openjdk:17-jdk-slim
COPY target/approval-service.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
然后Jenkins一键构建推送。我们组甚至把Docker镜像和Git分支挂钩——dev 分支推到测试环境,main 合并后自动上线。从此告别“在我机器上是好的”这种鬼话。
最后说点人话
Spring Boot确实能让你快速产出可用服务,但它不是银弹。我见过太多人以为用了Spring Boot就等于“现代化架构”,结果接口没鉴权、SQL没索引、日志没脱敏,上线三天就漏洞百出。
作为国企程序员,我图的不是技术多酷炫,而是稳、省事、不背锅。Spring Boot帮我省去了大量胶水代码,让我能把精力放在业务逻辑和边界case上——比如审批人离职了怎么办?超时自动通过吗?这些才是产品经理真正甩不掉的锅。
至于“60分钟上手”?别信。但如果你已经有Java基础,花两小时搞懂自动配置、外部化配置、Starter机制,再结合公司现有规范调整,基本就能安全交付任务了。
对了,最近我在研究怎么把大模型接入审批流做智能判断(比如自动识别报销单是否合规),所以还得啃Spring AI。不过那是下篇文章的事了——先让我把这周的需求干完,周末还得陪娃去上编程课呢(是的,我也开始卷下一代了)。
附:避坑清单(血泪总结)
| 坑点 | 正确做法 |
|---|---|
| 本地用H2数据库,生产用MySQL | 所有环境用同一数据库类型 |
| 默认使用内嵌H2控制台 | 生产禁用 /h2-console |
| Controller直接返回实体类 | 用DTO隔离内部模型 |
| 忘记全局异常处理 | @ControllerAdvice + 自定义异常 |
| 日志打印敏感信息 | 脱敏中间件 or 手动过滤 |
| 启动类放根包外 | 主类必须在最外层包,否则组件扫不到 |
好了,茶凉了,下班。

评论 0