Spring Boot入门教程:60分钟快速上手
上周五晚上9点半,我正瘫在工位上改一个医疗数据上报接口的Bug——又是那种“本地跑得好好的,一上线就502”的经典玄学。这时候产品小王突然闪过来:“老哥,下周能不能先搞个Demo出来?卫健委那边催得急。”
我翻了个白眼:“你这需求文档昨天才发,今天就要Demo?你当我是AI啊?”
他嘿嘿一笑:“不是有Spring Boot嘛,听说60分钟就能搭个后端?”
行吧。被产品经理拿捏了,再加上最近杭州这边阿里、网易都在招Java后端,虽然我是个Python仔,但为了跳槽简历不那么单薄,也得硬着头皮啃点Java生态的东西。更何况我们公司有些老系统还是Java写的,总不能每次联调都求后端大哥帮忙。
为什么是Spring Boot?
说实话,以前我对Java的印象还停留在“配置文件比代码长”、“启动慢得像泡面还没泡开”。但自从去年双11期间我们一个合作医院的HIS系统崩了(别问,问就是线程池没配好),对方紧急切到他们用Spring Boot重构的新模块,居然扛住了流量洪峰——那一刻我开始觉得,这玩意儿可能真有点东西。
Spring Boot最大的好处?约定优于配置。不用再手动配一堆XML,也不用纠结Tomcat怎么嵌入。开箱即用,连Swagger都能一键集成。对我们这种平时写FastAPI写惯了的人来说,简直像回家了一样舒服。
动手:60分钟搭建一个药品库存服务
目标很明确:做一个简单的RESTful API,支持查询、新增、修改药品库存。数据库用MySQL,接口要能被前端直接调(别提什么BFF层了,产品说先能跑就行)。
第一步:环境准备(5分钟)
# 确保装了JDK 17(别用8了兄弟们,2024年了)
java -version
# 用Spring Initializr生成项目骨架
# 我直接打开 https://start.spring.io
# 选Gradle(个人偏好,Maven也行)、Java、Spring Boot 3.2+
# Dependencies 加上:
# - Spring Web
# - Spring Data JPA
# - MySQL Driver
# - Lombok(省掉getter/setter,救命神器)
下载解压,IDEA打开——秒进项目,连pom.xml都不用手动改。这体验,比我司某些Python项目还要丝滑。
第二步:连数据库 & 定义实体(15分钟)
先在application.yml里配好数据库:
spring:
datasource:
url: jdbc:mysql://localhost:3306/med_stock?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
jpa:
hibernate:
ddl-auto: update # 开发阶段用update,生产记得改成validate!
show-sql: true
然后定义药品实体类:
@Entity
@Table(name = "drug_inventory")
@Data // Lombok注解,自动生成getter/setter/toString
public class Drug {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name; // 药品名
private String batchNo; // 批号
private Integer quantity; // 库存数量
}
吐槽一句:Java的泛型和类型系统确实严谨,但写个DTO真的累。好在Lombok救我狗命,不然光是setQuantity(quantity)就能写到凌晨。
第三步:写DAO和Service(15分钟)
JPA太香了,继承JpaRepository直接获得CRUD能力:
public interface DrugRepository extends JpaRepository<Drug, Long> {
List<Drug> findByNameContaining(String name);
}
Service层简单包装一下:
@Service
@Transactional
public class DrugService {
@Autowired
private DrugRepository drugRepo;
public Drug addDrug(Drug drug) {
if (drug.getQuantity() == null || drug.getQuantity() < 0) {
throw new IllegalArgumentException("库存不能为负");
}
return drugRepo.save(drug);
}
public List<Drug> searchByName(String keyword) {
return drugRepo.findByNameContaining(keyword);
}
}
这里其实埋了个坑:@Transactional加在Service上是对的,但如果以后要做分布式事务(比如扣库存同时发消息),就得上Seata或者Saga模式了——不过产品说“先别考虑那么复杂”,那我就假装没看见。
第四步:写Controller(10分钟)
RESTful接口走起:
@RestController
@RequestMapping("/api/drugs")
public class DrugController {
@Autowired
private DrugService drugService;
@PostMapping
public ResponseEntity<Drug> addDrug(@RequestBody Drug drug) {
try {
Drug saved = drugService.addDrug(drug);
return ResponseEntity.ok(saved);
} catch (IllegalArgumentException e) {
return ResponseEntity.badRequest().build();
}
}
@GetMapping("/search")
public List<Drug> search(@RequestParam String q) {
return drugService.searchByName(q);
}
}
测试一下:
curl -X POST http://localhost:8080/api/drugs \
-H "Content-Type: application/json" \
-d '{"name":"阿莫西林","batchNo":"B20240520","quantity":100}'
返回200,数据库也插入成功——成了!
第五步:加点生产级配置(15分钟)
开发完不算完,上线才是噩梦开始。赶紧补几个关键配置:
| 配置项 | 开发环境 | 生产环境建议 |
|---|---|---|
ddl-auto |
update |
validate |
| 日志级别 | DEBUG |
INFO 或 WARN |
| 连接池 | Hikari默认 | 显式配置maximum-pool-size |
| 健康检查 | 无 | 加/actuator/health |
另外,一定要加全局异常处理,否则一个NPE直接返回500,运维半夜打电话骂你:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<String> handleIllegalArg(Exception e) {
return ResponseEntity.badRequest().body(e.getMessage());
}
}
上线前的灵魂拷问
虽然60分钟搞定了功能,但真要上线,还得过几道关:
- 性能:单机QPS多少?压测过了吗?(我们用JMeter跑过,100并发下平均响应<50ms)
- 安全:SQL注入?XSS?(JPA参数化查询天然防注入,但前端传参还是要校验)
- 可观测性:日志有没有traceId?(得集成Sleuth + Zipkin,不过这次先砍掉)
- 部署:Dockerfile写了没?(必须写!运维只认镜像)
最惨的一次教训:有次忘了关show-sql,结果线上日志刷屏,磁盘爆了。从此以后,所有配置项我都用@Profile区分环境。
写在最后:Python仔的Java初体验
折腾完这个小项目,我不得不承认:Spring Boot确实把Java后端的门槛降了不少。虽然代码量比Flask多,但换来的是更强的类型安全、更完善的生态、以及——对,重点来了——更容易通过大厂面试。
当然,工作中我还是会用Python处理数据管道、写脚本、做AI模型服务。但多掌握一门主流后端技术,至少下次产品再说“60分钟搞定”时,我能笑着回他:“行,不过得加钱。”
如果你也是非Java背景想快速上手,别怕。Spring Boot的设计哲学就是“让新手也能写出不太烂的代码”。至于那些复杂的AOP、自动装配原理?等你被线上事故毒打几次后,自然会去翻源码。
哦对了,这个药品库存Demo我已经丢GitHub了(搜 med-stock-springboot-demo),欢迎Star(虽然可能只有我自己看)。要是你们产品也催得紧,直接fork改改就能交差——程序员互助,从我做起。
杭州某医疗软件公司 · Python开发 · 但被迫写Java的人
2024年5月 · 深夜加班后 · 咖啡见底 · 但心满意足

评论 0