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

Web架构师
2025-12-14 17:03
阅读 492

上周五晚上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 INFOWARN
连接池 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

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝