从零开始用Spring Boot:60分钟搭建你的第一个后端服务

技术清醒派
2025-06-15 07:45
阅读 212

作为一名有五年后端开发经验的程序员,我经历过从传统的XML配置到如今微服务架构的演变。在日常工作中,Spring Boot 成为了我们团队最常用的技术栈之一。它的“约定优于配置”理念和快速构建能力,极大提升了我们的开发效率。

今天我想分享的是一个我在新项目中快速上手 Spring Boot 的实战经历。这个经历不仅帮助我完成了一个紧急上线的小型管理后台项目,也让我重新审视了现代 Java 后端开发的一些关键要点。

背景介绍

背景介绍

那是一个去年冬天的事情。客户要求我们在一周内上线一个小型的员工请假管理系统。虽然功能不算复杂,但时间紧、人员少,只有一个前端+我一个后端。为了保证按时交付,我决定使用 Spring Boot 快速搭建基础框架,并在这个过程中总结出一套可复用的模板。

当时我给自己定了一个目标:在60分钟之内,完成 Spring Boot 项目的初始化、接口定义、数据库连接、基本业务逻辑和测试流程。听起来有点挑战?其实只要你掌握套路,这一切都是可以实现的。


第一步:快速创建 Spring Boot 项目(5分钟)

API接口文档-1

第一步:快速创建 Spring Boot 项目(5分钟)

我通常会直接使用 Spring Initializr 创建初始项目。这次我选择:

  • Project: Maven
  • Language: Java 17(现在普遍用 Java 11/17)
  • Dependencies:
    • Spring Web
    • Spring Data JPA
    • MySQL Driver
    • Lombok
    • Spring Boot DevTools(开发调试非常有用)

下载下来的项目结构很清晰,我已经不需要手动添加各种启动器依赖,这是 Spring Boot 给开发者的一大便利。

小插曲:第一次运行时报错 No active profile set。后来我发现是忘记配置 application.properties 啦!这个错误在后面几次就再也没出现过,算是个小小的教训。


第二步:数据库设计与模型定义(10分钟)

第二步:数据库设计与模型定义(10分钟)

接下来我要处理数据层。根据业务需求,系统需要两个核心表:employeeleave_request

CREATE TABLE employee (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100)
);

CREATE TABLE leave_request (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    employee_id BIGINT NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL,
    reason VARCHAR(500),
    status VARCHAR(20) DEFAULT 'PENDING',
    FOREIGN KEY (employee_id) REFERENCES employee(id)
);

对应的实体类也很简单,用了 Lombok 的 @Data 简化代码量:

@Entity
@Data
public class LeaveRequest {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Employee employee;
    
    private LocalDate startDate;
    private LocalDate endDate;
    private String reason;
    private String status;
}

这里有个小技巧:如果你刚开始不确定字段名,可以先建好数据库,用 IDE 插件(比如 IDEA 的 JPA Buddy)帮你自动生成实体类。效率高还不容易写错字段名。


第三步:配置数据库连接(5分钟)

打开 application.properties 配置 MySQL 数据源:

spring.datasource.url=jdbc:mysql://localhost:3306/leave_system?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

注意这里的几个细节:

  • 如果你用的是本地开发,记得把 ddl-auto 设置为 updatenone
  • 生产环境千万不要开 show-sql,会有性能损耗
  • 使用 UTF8MB4 编码时,URL 里要加 characterEncoding=UTF-8 等参数

第四步:编写 Repository 层(5分钟)

这一步非常简单,只需要继承 JpaRepository 接口即可:

public interface LeaveRequestRepository extends JpaRepository<LeaveRequest, Long> {
    List<LeaveRequest> findByEmployeeId(Long employeeId);
}

JPA 会自动根据方法命名生成 SQL 查询语句。这种“约定大于配置”的方式节省了大量样板代码。不过要注意命名规则是否符合规范,否则可能查不出数据。


第五步:实现 Service 层(10分钟)

Service 层主要负责处理业务逻辑:

@Service
@RequiredArgsConstructor
public class LeaveService {

    private final LeaveRequestRepository repository;

    public LeaveRequest createLeave(LeaveRequest request) {
        request.setStatus("PENDING");
        return repository.save(request);
    }

    public List<LeaveRequest> getLeavesByEmployee(Long empId) {
        return repository.findByEmployeeId(empId);
    }

    public LeaveRequest approveLeave(Long id) {
        LeaveRequest req = repository.findById(id).orElseThrow();
        req.setStatus("APPROVED");
        return repository.save(req);
    }
}

这里我用了 Lombok 的 @RequiredArgsConstructor 自动生成构造函数注入,避免写一堆 @Autowired,同时也更容易做单元测试。


第六步:设计 RESTful API(10分钟)

Controller 层要尽可能简洁,只做请求转发和返回结果:

@RestController
@RequestMapping("/api/leaves")
@RequiredArgsConstructor
public class LeaveController {

    private final LeaveService service;

    @PostMapping
    public ResponseEntity<LeaveRequest> create(@RequestBody LeaveRequest request) {
        return ResponseEntity.ok(service.createLeave(request));
    }

    @GetMapping("/employee/{id}")
    public ResponseEntity<List<LeaveRequest>> getByEmployee(@PathVariable Long id) {
        return ResponseEntity.ok(service.getLeavesByEmployee(id));
    }

    @PutMapping("/{id}/approve")
    public ResponseEntity<LeaveRequest> approve(@PathVariable Long id) {
        return ResponseEntity.ok(service.approveLeave(id));
    }
}

关于接口设计,我的建议是:

  • URL 设计要统一风格,尽量用名词,别用动词
  • 返回值要有统一封装结构,比如 ResponseEntity<ApiResponse<T>>,方便前端解析
  • 所有异常都应该有统一的异常处理器(可以用 @ControllerAdvice 实现)

第七步:运行、验证和测试(15分钟)

执行 mvn spring-boot:run 或直接运行主类,等服务启动后就可以用 Postman 测试接口啦。

  • 创建请假:POST /api/leaves body 传 JSON
  • 查看员工请假记录:GET /api/leaves/employee/123
  • 审批请假:PUT /api/leaves/1/approve

在这期间我遇到一个小问题:前端说状态改不了。查日志发现是因为 PUT 接口没有设置允许跨域访问。于是我在 application.properties 中加了:

spring.mvc.async.request-timeout=0
spring.webflux.cors.allowed-origins=* 
spring.webflux.cors.allowed-methods=*

虽然不是最好的做法,但在项目初期这样先跑起来没问题。


回顾一下整个过程

步骤 内容 时间
Step 1 初始化项目 5 min
Step 2 数据库建模 10 min
Step 3 数据源配置 5 min
Step 4 数据访问层 5 min
Step 5 业务逻辑 10 min
Step 6 控制器设计 10 min
Step 7 运行测试 15 min

总计约 60 分钟,确实可以在一小时内完成一个具备基础功能的 Spring Boot 应用原型。


实战中的几点心得

✅ 使用 Spring Boot 的优势

  • 极大简化了配置,几乎不用写 XML
  • 自动装配机制让组件集成更简单
  • 很多场景都有 starter 模块可直接引入
  • 开箱即用的监控、安全、测试等功能非常实用

❗常见坑点提醒

  1. 不要滥用 JPA 命名查询,尤其是复杂的多表关联查询,建议自己写 SQL
  2. 数据库迁移工具一定要引入(比如 Flyway 或 Liquibase),不然生产上线维护困难
  3. 日志级别要控制好,devtools 可以开启 debug,但线上一定记得关掉
  4. 跨域问题早期就要解决,不然前端同学会来找你“喝茶”

实际部署的一些建议

这个项目后来上线到了阿里云服务器,结合 Nginx + MySQL + Spring Boot 架构。以下是一些实际运维经验:

🚀 性能优化

  • 配置连接池:使用 HikariCP,提高 DB 连接效率
  • 启用懒加载:对于 @OneToOne@OneToMany 的关系,按需加载数据
  • 启用缓存:如 Redis 存储员工信息或权限数据

🛡️ 安全方面

  • 加入 Spring Security,至少做个登录拦截
  • 使用 JWT 做 Token 验证
  • 不同角色接口做 RBAC 权限控制
  • 输入校验不能省,用 Bean Validation + Hibernate Validator

📊 监控建议

  • 引入 Spring Boot Actuator 查看健康状态
  • 日志文件定期清理,推荐 Logback + RollingFileAppender
  • 上线前务必配置 proper logging level(生产环境一般设为 INFO 或 WARN)

最后一点真心话

其实 Spring Boot 本身不难,最难的是如何把它用得优雅、高效,同时兼顾可维护性、可扩展性和安全性。它只是一个工具,真正的价值在于你怎么用它去构建稳定、高性能的服务。

通过这次实战,我也更加体会到:

  • 一个合格的后端工程师,不只是能写接口,更要懂架构、懂运维、懂性能调优
  • “快”不是目的,“稳+快”才是核心竞争力
  • 在真实项目中,文档和代码一样重要

结语

希望这篇文章能给刚入门 Spring Boot 的小伙伴们一些启发。别怕学不会,也不要死磕理论,最好的方式就是动手做一个小项目练手。

Spring Boot 是现代 Java 开发的标配,熟练掌握不仅能提升工作效率,更能让你在职场上有更强的竞争力。当然,这只是万里长征的第一步,还有 Spring Cloud、分布式事务、微服务治理等更多内容等着你去探索。

加油吧,打工人!

——来自一位普通后端程序员的心声

评论 0

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