Spring Boot入门教程:60分钟快速上手
从零上手Spring Boot:一个后端开发者的实战经验分享

开篇:为什么要写这篇Spring Boot入门教程?
记得我刚加入互联网公司时,第一个接到的任务就是用Spring Boot搭建一个服务,用来支撑我们产品中的一块新功能模块。那会儿我对Spring Boot还一知半解,虽然大学里接触过Java Web相关的知识,但实际落地到工程里,完全不知道如何下手。
好在当时的Leader没有让我“自学”,而是带着我一步步搭了个简单的项目骨架,跑通了接口,完成了数据库交互……那一刻我真的体会到,“上手”不一定要读完官方文档或看完整本书,跟着实际场景动手做出来才是最快的。
这篇文章就基于那次经历和后来的持续实践,我会带你60分钟内完成一个Spring Boot项目的搭建、接口实现以及部署上线的基本流程,并且结合我在工作中遇到的真实问题,让你少走弯路。
问题描述:业务需求和技术挑战
当时我们的任务是开发一个用户行为埋点上报服务,也就是接收前端埋点发送过来的各种事件数据,然后保存进数据库,并对外提供查询接口供BI使用。
看起来是一个相对标准的CRUD项目,但在具体实施过程中还是遇到了不少挑战:
- 快速启动 Spring Boot 项目太麻烦,尤其在配置多环境和连接数据库的时候。
- 接口设计需要考虑性能和并发处理能力,因为数据量可能会很大。
- 我们需要把服务部署到生产环境中,刚开始对打包、日志、热部署这些概念都很模糊。
最终,我们选择使用 Spring Boot 快速构建这个服务,并搭配 HikariCP 做连接池管理、JPA 做数据访问层封装,最后用 Nginx + Docker 部署上线,效果还不错。下面我就来复盘整个过程。
解决方案:为什么选Spring Boot?
在调研技术栈的时候,我本来也考虑过直接上 Spring MVC 手动搭个框架,毕竟那时对 Spring Boot 的理解还不深。但 Leader 给了一个很实际的理由:“你不是要研究底层原理,而是要在最短时间内交付一个稳定能跑的系统。” 这句话我一直记着。
Spring Boot 的优势在于以下几个方面:
- 自动装配(Auto Configuration) 简化了很多基础配置
- 内嵌 Tomcat,不用再单独配服务器
- 支持 YAML/properties 多种格式配置,适合不同环境切换
- 提供 Actuator 监控健康状态、指标等运维常用功能
我们决定使用 Spring Boot + Spring Data JPA + MySQL 的组合,快速完成这个项目的基础搭建。同时为了方便部署,我们也引入了 Maven 作为依赖管理工具。
实战操作:一步一步搭建 Spring Boot 项目
注:以下操作假设读者已有 Java 17 和 Maven 基础环境(推荐安装 IntelliJ IDEA),如果你还不熟悉这些,请先安装好相关工具。
第一步:初始化 Spring Boot 工程(约5分钟)
最简单的方式是去 start.spring.io 上生成一个模板项目。我们选择了如下配置:
- Project: Maven
- Language: Java
- Spring Boot Version: 3.1.x(当前稳定版本)
- Dependencies:
- Spring Web(Web应用)
- Spring Data JPA(数据库交互)
- MySQL Driver(MySQL驱动)
- Lombok(简化Java Bean编写)
- Spring Boot DevTools(开发工具,热重载)
下载并导入IDEA后就能看到一个干净的Spring Boot工程结构:
src/
├── main/
│ ├── java/com/example/demo/
│ │ ├── DemoApplication.java
│ │ └── controller/
│ │ └── EventController.java
│ │ └── entity/
│ │ └── EventEntity.java
│ │ └── repository/
│ │ └── EventRepository.java
│ ├── resources/
│ ├── application.yml
│ ├── data.sql (可选)
│ └── schema.sql (可选)
第二步:配置 application.yml(约3分钟)
接下来我们配置数据库信息。我们选择 MySQL 作为数据存储引擎,并且希望支持多个环境,比如本地 dev 和线上 prod。
创建 /resources/application.yml:
spring:
datasource:
url: jdbc:mysql://localhost:3306/event_db?useSSL=false&serverTimezone=UTC
username: root
password: your_password_here
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 5
auto-commit: true
jpa:
hibernate:
use-new-id-generator-mappings: false
show-sql: true
ddl-auto: update
logging:
level:
com.example.demo.repository: debug
这一步非常重要,尤其是连接池配置。我之前就踩过坑,默认的连接池参数太小,在高并发请求下会出现超时问题。Hikari CP 是默认推荐的连接池,性能很好,建议按实际情况调整参数。
第三步:定义实体与Repository(约10分钟)
我们的埋点数据包括事件名、发生时间、用户ID、设备信息等字段。创建 EventEntity 类:
@Entity
@Table(name = "event_log")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EventEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String eventName;
@Column(nullable = false)
private String userId;
@Column(columnDefinition = "TEXT")
private String deviceInfo;
@Column(updatable = false)
@CreationTimestamp
private LocalDateTime createdAt;
}
Lombok 的 @Data 为我们省去了 getter/setter 和 toString 方法。接着创建 Repository:
public interface EventRepository extends JpaRepository<EventEntity, Long> {
}
只需要声明接口即可,Spring Data JPA 会帮我们自动生成实现类。
第四步:编写Controller接口(约10分钟)
现在我们开始写对外暴露的 API,这部分需要遵循 RESTful 规范。我们需要两个接口:
/api/eventsPOST 新增事件/api/eventsGET 查询历史记录
代码如下:
@RestController
@RequestMapping("/api/events")
@RequiredArgsConstructor
@Slf4j
public class EventController {
private final EventRepository eventRepository;
@PostMapping
public ResponseEntity<?> createEvent(@RequestBody CreateEventRequest request) {
try {
EventEntity entity = new EventEntity();
entity.setUserId(request.getUserId());
entity.setDeviceInfo(request.getDeviceInfo());
entity.setEventName(request.getEventName());
EventEntity saved = eventRepository.save(entity);
return ResponseEntity.ok(saved.getId());
} catch (Exception e) {
log.error("Error saving event", e);
return ResponseEntity.status(500).build();
}
}
@GetMapping
public List<EventEntity> listEvents() {
return eventRepository.findAll();
}
}
注意,我在这里用了 CreateEventRequest 这个 DTO 来接受请求体,而不是直接传入 EventEntity,这是为了分离接口传输模型和数据库实体模型。
第五步:测试API接口(约5分钟)
IDEA自带的 Run 功能就可以启动应用。Spring Boot 启动完成后会输出类似下面的日志:
Tomcat started on port(s): 8080 (http) with context path ''
Started DemoApplication in 3.2 seconds (JVM running for 4.1)
可以使用 Postman 或 curl 测试接口:
curl -X POST http://localhost:8080/api/events \
-H "Content-Type: application/json" \
-d '{"eventName":"page_view", "userId":"123456", "deviceInfo":"iPhone"}'
返回结果应该是一个事件ID,说明插入成功。GET 请求也可以验证是否正常读取数据库数据。
踩坑经验:那些让人崩溃的细节问题
当然,光写代码是不够的,真正运行起来才发现还有各种细节需要注意:
🐞 数据库表没建好导致启动失败?
我们在初期没有提前创建 event_db 数据库,也没有设置字符集,导致启动时报错:
Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'event_db'
解决办法是在 MySQL 中手动执行:
CREATE DATABASE event_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
另外,如果表结构复杂或者你想在启动时初始化表结构,可以在 resource 下添加 schema.sql 和 data.sql 文件,让 Spring Boot 自动执行它们。
🐞 日志显示 SQL 没有执行?
有时候你会发现接口返回了OK,但是数据库查不到数据。排查发现是因为 事务未提交或连接池未释放连接。这时候要检查数据库是否启用了 autocommit。
🐞 高并发下请求阻塞?
这个问题出现在我们上线后的压测阶段。当 QPS 达到每秒 500+ 时,出现了大量连接等待的问题。最终通过优化连接池参数和增加数据库索引来缓解压力:
spring:
datasource:
hikari:
maximum-pool-size: 30
max-lifetime: 1800000
同时在数据库中加上对 userId, createdAt 的联合索引,提升查询效率。
效果总结:一次快速而有效的服务搭建
项目上线后,我们实现了以下几点:
- 单服务节点每天承载了超过 10 万次的埋点请求
- 接口平均响应时间在 20ms 左右,TP99 控制在 100ms 内
- 日志系统集成后,可以实时查看运行状态,便于快速定位问题
- 使用 Actuator 实现了健康检查和线程监控,为后续自动化运维打下了基础
最关键的是:只花了不到一周时间就把这个模块做完并上线了,团队反馈非常好。
经验分享:给新手的几个实用建议
作为一名经历过无数次“从无到有”的开发者,我想分享几点关于学习 Spring Boot 的个人心得:
✅ 不要死磕文档,先跑起来再说
很多同学想先把 Spring Boot 官方文档看完再开工,其实没必要。文档虽然全面,但对于初学者来说太抽象。不如先找个真实业务练手,边学边改,进步更快。
✅ 学会使用调试工具和日志
像 Logback、SLF4J 这些日志框架是你排查问题的第一利器。学会看日志、分析堆栈异常,比你会写代码更重要。
✅ 关注性能和扩展性
即使是小项目也要考虑未来可能的增长空间,比如数据库容量、并发上限。早做设计远胜于事后重构。
✅ 多问“为什么”,少抄代码
网上有很多博客、教程贴出完整代码,但你必须明白每一行的作用。比如为什么要用 devtools?Hikari CP 的参数怎么调?这些背后都有道理。
✅ 学会善用社区资源
Spring Boot 社区非常活跃,GitHub 上有许多开源样例。遇到难题时别闭门造车,去 Stack Overflow、掘金、知乎看看别人的解决方案,通常能找到答案。
结语:Spring Boot 并非终点,而是起点
这篇文章只是带大家快速上手 Spring Boot,实际开发中还有很多高级用法,比如缓存整合(Redis)、消息队列(Kafka)、微服务拆分(Spring Cloud)等等。但只要你迈出第一步,后面的路就不会太难走。
我记得我第一次部署服务上线那天,心里特别紧张,生怕哪里出错。结果服务稳稳定定跑了两个月没出问题。那种成就感,比什么都来得实在。
愿你也能在这条路上越走越远,成为一名真正的优秀后端开发者。如果有任何问题,欢迎留言交流,一起进步!
🔚 如果你觉得这篇文章对你有帮助,欢迎点赞/收藏/转发,你的认可是我继续写作的动力!

评论 0