从零开始用Spring Boot:60分钟搭建你的第一个后端服务
作为一名有五年后端开发经验的程序员,我经历过从传统的XML配置到如今微服务架构的演变。在日常工作中,Spring Boot 成为了我们团队最常用的技术栈之一。它的“约定优于配置”理念和快速构建能力,极大提升了我们的开发效率。
今天我想分享的是一个我在新项目中快速上手 Spring Boot 的实战经历。这个经历不仅帮助我完成了一个紧急上线的小型管理后台项目,也让我重新审视了现代 Java 后端开发的一些关键要点。
背景介绍

那是一个去年冬天的事情。客户要求我们在一周内上线一个小型的员工请假管理系统。虽然功能不算复杂,但时间紧、人员少,只有一个前端+我一个后端。为了保证按时交付,我决定使用 Spring Boot 快速搭建基础框架,并在这个过程中总结出一套可复用的模板。
当时我给自己定了一个目标:在60分钟之内,完成 Spring Boot 项目的初始化、接口定义、数据库连接、基本业务逻辑和测试流程。听起来有点挑战?其实只要你掌握套路,这一切都是可以实现的。
第一步:快速创建 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分钟)

接下来我要处理数据层。根据业务需求,系统需要两个核心表:employee 和 leave_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设置为update或none - 生产环境千万不要开
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/leavesbody 传 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 模块可直接引入
- 开箱即用的监控、安全、测试等功能非常实用
❗常见坑点提醒
- 不要滥用 JPA 命名查询,尤其是复杂的多表关联查询,建议自己写 SQL
- 数据库迁移工具一定要引入(比如 Flyway 或 Liquibase),不然生产上线维护困难
- 日志级别要控制好,devtools 可以开启 debug,但线上一定记得关掉
- 跨域问题早期就要解决,不然前端同学会来找你“喝茶”
实际部署的一些建议
这个项目后来上线到了阿里云服务器,结合 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