前端与后端 / 技术笔记

Spring Boot 服务开发

从一个业务接口出发,理解 Spring Boot 如何组织依赖、分层代码并保护数据写入。

内容章节
6 节
阅读重点
分层与事务
示例语言
Java

直接使用 Java 编写 Web 服务,需要处理服务器启动、路由映射、对象创建和大量配置。Spring Boot 把这些常见工作整理成约定,让开发者更专注于业务。

Java 示例

java

@RestController@RequestMapping("/api/projects")class ProjectController {    @GetMapping("/{id}")    ProjectDto getProject(@PathVariable Long id) {        return projectService.getById(id);    }}

Spring Boot 为应用提供一致的启动方式和组件协作规则,代码精简是随之得到的结果。

1. Spring Boot 帮我们省掉了什么

Spring Boot 会根据依赖和配置推断应用需要的组件。例如加入 Web 依赖后,它会准备内嵌服务器、JSON 转换和请求分发。

文本示意

text

项目依赖自动配置创建应用上下文启动 Web 服务

自动配置由一组条件规则驱动,它会根据当前依赖选择常见配置,我们仍然可以覆盖默认值。

2. Controller、Service 和 Repository 怎样分工

三个层次分别处理三类问题:

文本示意

text

Controller  读取请求并返回响应Service     执行业务规则Repository  读写数据库

Java 示例

java

@Serviceclass ProjectService {    ProjectDto getById(Long id) {        return repository.findById(id)            .map(ProjectDto::from)            .orElseThrow(ProjectNotFoundException::new);    }}

分层让 HTTP、业务规则和数据访问可以分别变化,修改其中一层时,其余代码能够保持稳定。

3. 依赖注入为什么重要

如果一个类自己创建所有依赖,它就很难替换和测试。

Java 示例

java

class ProjectService {    private final ProjectRepository repository;
    ProjectService(ProjectRepository repository) {        this.repository = repository;    }}

Spring 容器负责创建对象并把 Repository 交给 Service。测试时也能传入一个内存实现,不必连接真实数据库。

4. 请求参数怎样校验

参数校验应该靠近请求入口,业务层则继续检查只有业务自己知道的规则。

Java 示例

java

record CreateProjectRequest(    @NotBlank String title,    @Size(max = 300) String description) {}
@PostMappingProjectDto create(@Valid @RequestBody CreateProjectRequest request) {    return projectService.create(request);}

字段不能为空属于格式规则,当前用户能否创建项目属于业务规则。把两者分开,错误提示会更准确。

5. 事务应该放在哪里

事务应该覆盖一个完整的业务动作,它的范围通常会包含多条相互依赖的 SQL。

Java 示例

java

@Transactionalpublic Order createOrder(CreateOrderCommand command) {    inventoryService.decrease(command.productId());    return orderRepository.save(Order.create(command));}

库存减少和订单创建必须一起成功。任何一步失败,事务都会回滚数据库修改。

事务通常放在 Service 层,因为这里最清楚一个业务动作包含哪些写入。

6. 一个服务接口如何完整运行

一次创建订单的流程可以这样理解:

文本示意

text

HTTP 请求进入 ControllerBean Validation 校验格式Service 开启事务检查库存并创建订单Repository 写入数据库提交事务Controller 返回结果

当接口出现问题时,先判断错误属于请求格式、业务规则还是数据访问,再进入对应层排查。分层的价值会在这种时刻真正体现出来。