Spring Boot入门教程:60分钟快速上手
从零开始搭建Spring Boot项目:60分钟内掌握核心开发技巧
去年我接手了一个中小型电商平台的重构任务。项目原本是用 Java Servlet 和 JSP 搭建的老旧架构,代码冗余严重、结构混乱,维护成本极高。我们需要快速上线新版后端接口服务,并且要求新系统具备良好的可扩展性和清晰的工程结构。
这时候我们决定采用 Spring Boot。对于当时的团队来说,它是一个相对新颖的技术栈。虽然部分成员对 Spring 框架有一定了解,但真正基于 Spring Boot 进行完整项目开发的经验几乎为零。于是我们做了一个简单的决策 —— 给大家安排一个“60分钟实战演练”,让大家快速上手,打好新项目的基础。
这篇文章就是那次实践过程的真实记录,我会结合实际工作中的经验和遇到的问题,带大家一起走完从创建项目到初步运行的全过程。
项目背景与挑战

这个项目的核心诉求非常简单:为前端提供 RESTful API 接口,支撑商品管理、订单处理等核心业务功能。
但摆在我们面前的几个问题却并不简单:
- 时间紧:留给技术预研和原型搭建的时间只有三天。
- 人员技能不均:有三位刚毕业不久的同事,对 Spring 家族框架不熟悉。
- 没有历史参考案例:公司此前没有基于 Spring Boot 做过正式项目。
- 希望引入现代化 DevOps 流程:比如热部署、日志自动上传、接口文档自动化生成等能力。
面对这些问题,我们必须找到一个既能迅速上手、又能支持后续迭代的技术方案。
我们为什么选择 Spring Boot?

在对比了几个主流轻量级 Java 框架(如 Play Framework、Micronaut)之后,我们最终选择了 Spring Boot,主要原因如下:
- 开箱即用:集成了大量常用组件,省去了繁琐配置。
- 生态成熟:Spring Security、Spring Data、Spring Web 等子项目稳定可靠。
- 社区活跃:有问题基本都能在 GitHub 或 StackOverflow 找到答案。
- 与微服务友好集成:未来如果需要拆分服务,也更容易对接 Spring Cloud。
更重要的是,我们可以利用 Spring Initializr 快速生成项目骨架,节省大量初始化配置时间,这对于新手也非常友好。
实战演练:60分钟完成从0到1
这次演练的目标很明确:60分钟内,每个人都要成功跑起一个包含数据库访问、接口定义和基础配置的 Spring Boot 应用。以下是我们当天的具体安排。
第一步:使用 Spring Initializr 创建项目(5分钟)
我们统一采用了 start.spring.io 来生成项目脚手架。选择以下依赖项:
- Spring Web(构建 Web 层)
- Spring Data JPA(用于 ORM 操作)
- H2 Database(本地测试使用内存数据库)
- Lombok(简化实体类书写)
- Actuator(监控健康状态)
生成后直接下载解压,在 IDE 中打开即可,避免手动添加依赖包和配置文件的麻烦。
小插曲:
有位新同事不知道该用哪个打包方式,默认选了 War 包,结果启动时报错找不到主类。后来才发现,如果是 War 包,还需要继承 SpringBootServletInitializer 类,否则无法部署。所以如果你是初学者,建议一开始先用 Jar 包格式,减少不必要的调试时间。
第二步:理解项目目录结构(5分钟)
新建的 Spring Boot 工程默认会有一个如下的目录结构:
src
├── main
│ ├── java
│ │ └── com.example.demo
│ │ ├── DemoApplication.java
│ │ └── controller / service / repository / model (我们后面要自己建)
│ ├── resources
│ ├── application.properties
│ └── data.sql / schema.sql (可选)
└── test
关键点:
DemoApplication是程序入口,加了@SpringBootApplication注解。- 配置信息主要集中在
application.properties(或 yml 文件)中。 - 所有 Bean 的扫描路径由这个主类所在的 package 及其子包构成。
经验分享:养成良好的目录结构习惯非常重要。我们通常把 Controller 放在 api 包下,Service 放在 service,DAO 在 repository,模型类放在 model,逻辑模块可以再分层。
第三步:写一个最简单的 Hello World 接口(10分钟)
我们先来验证一下整个流程是否正常。编写一个控制器类:
@RestController
@RequestMapping("/hello")
public class HelloController {
@GetMapping
public String sayHello() {
return "Hello, Spring Boot!";
}
}
运行项目后访问 http://localhost:8080/hello,可以看到返回字符串。
调试小贴士:
- 启动失败时优先检查主类是否正确带有
@SpringBootApplication。 - 如果出现端口冲突,可以在配置文件中修改
server.port=8081。 - 控制台输出的日志非常重要,很多错误信息都可以从中定位。
第四步:接入数据库并实现增删改查(20分钟)
为了模拟真实业务场景,我们接下来要创建一个“商品”实体,完成基本的 CRUD 操作。
1. 数据库配置(application.properties)
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
说明:这里用的是 H2 内存数据库,适合测试环境;生产环境中我们会换成 MySQL 或 PostgreSQL。
2. 编写实体类(Product.java)
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
}
3. 编写 Repository 接口
public interface ProductRepository extends JpaRepository<Product, Long> {
}
4. 编写 Service 层(简化版)
@Service
@RequiredArgsConstructor
public class ProductService {
private final ProductRepository productRepository;
public List<Product> getAllProducts() {
return productRepository.findAll();
}
public Product getProductById(Long id) {
return productRepository.findById(id).orElseThrow();
}
public Product createProduct(Product product) {
return productRepository.save(product);
}
public void deleteProduct(Long id) {
productRepository.deleteById(id);
}
}
5. 编写 Controller
@RestController
@RequestMapping("/products")
@RequiredArgsConstructor
public class ProductController {
private final ProductService productService;
@GetMapping
public List<Product> getAll() {
return productService.getAllProducts();
}
@GetMapping("/{id}")
public Product getById(@PathVariable Long id) {
return productService.getProductById(id);
}
@PostMapping
public Product create(@RequestBody Product product) {
return productService.createProduct(product);
}
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
productService.deleteProduct(id);
}
}
启动项目后可以通过 Postman 测试这些接口是否正常。
性能优化提示:
虽然只是个示例项目,但我们还是强调了两点:
- 查询接口尽量不要暴露全部字段,可以用 DTO 做映射;
- 分页查询应该使用
Pageable接口,避免一次性拉取所有数据。
第五步:添加 Swagger 接口文档(10分钟)
为了让前后端联调更高效,我们引入了 Swagger 来自动生成接口文档。
添加依赖:
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger2</artifactId>
<version>2.2.0</version>
</dependency>
启用配置:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket apiDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.demo"))
.build();
}
}
然后就可以通过访问 http://localhost:8080/v2/api-docs 查看 JSON 格式的接口描述,或者访问 http://localhost:8080/swagger-ui.html 查看 UI 页面。
注意事项:
- 使用 Lombok 的时候,Swagger 有时无法识别字段注释。可以用
@ApiModelProperty注解补充说明。 - 生产环境应考虑关闭或限制访问权限,避免暴露敏感接口信息。
第六步:整合 Actuator 监控系统健康状况(5分钟)
Spring Boot 自带的 Actuator 插件非常适合用于监控系统的健康状况、查看线程池、获取堆栈信息。
我们在 application.properties 中启用一些基础监控项:
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
访问 http://localhost:8080/actuator/health 就能看到当前应用的健康状况。
实际运维反馈:
在我们实际生产部署中,这个接口帮助我们快速判断服务是否挂掉或连接不上数据库。同时还可以搭配 Prometheus + Grafana 做可视化监控。
第七步:热部署提升开发效率(5分钟)
Spring Boot 默认每次修改代码都需要重启服务器,影响开发效率。我们加入了 Spring Boot Devtools:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
然后开启 IDEA 的自动编译功能(快捷键 Ctrl+F9),就能实现代码修改后自动 reload,大幅提升调试效率。
效果总结
整个 60 分钟实战完成后,我们达到了以下几个目标:
- 每位成员都搭建出自己的 Spring Boot 应用;
- 掌握了从 Controller 到 DB 访问的完整调用链路;
- 初步掌握了接口文档管理、热部署等实用工具;
- 项目结构规范统一,为后续协作打下基础。
最重要的是:没有人因为环境或依赖问题卡住,所有人都能在一小时内看到成果。
随后我们将这个项目模板作为新项目的 starter kit,大幅减少了搭建初期的沟通成本,也为后续扩展提供了良好基础。
开发中的小感悟
在这次实践中,我特别体会到一句话的重要性:“框架是手段,不是目的。”
Spring Boot 的强大之处在于它极大地降低了框架使用的门槛,但它本身并没有强制你怎么做设计、怎么划分模块。很多同学上来就忙着搭框架,却忽略了最根本的业务逻辑梳理和工程结构规划。
我经常提醒团队:“别急着写 Controller,先想清楚每个模块的职责边界,设计好数据流,比什么都重要。”
另外,作为一个技术负责人,我也发现了一个有意思的现象:越是“方便”的东西,越容易让人忽略底层原理。很多人会熟练地写出 CRUD 接口,但一旦数据库连接池配置不合理、事务控制不清晰时,就会束手无策。
因此,我们在后面的训练营里还专门加入了一些进阶课题,比如:
- Spring IOC 和 AOP 的底层机制;
- Spring Boot 自动装配的原理;
- JPA 与 MyBatis 的性能对比;
- 数据库索引优化与慢查询分析方法。
只有了解背后的东西,才能真正把技术用好。
给读者的一些建议
如果你是刚刚接触 Spring Boot 的开发者,我推荐你按照以下步骤来学习:
- 从官方文档入手:Spring Boot Reference Guide 写得非常好,尤其第一章值得通读。
- 动手实践比纯理论更重要:光看教程不练等于白学,哪怕每天写一个小功能,积累下来进步会非常快。
- 养成良好的工程规范:命名、包结构、日志管理这些看起来不起眼的小事,其实是决定项目质量的关键。
- 多问为什么:不要停留在“这样做可以”,而是要知道“为什么要这么做”。
最后送大家一句话:“技术是用来解决问题的,而不是用来炫技的。” 学再多框架、记再多语法,都不如踏踏实实做一个能落地的功能更有价值。
如果你觉得这篇文章对你有帮助,欢迎留言交流你的 Spring Boot 实践经历,或者告诉我你在入门过程中遇到了哪些困惑,我会尽力解答。
Happy coding!

评论 0