
这里是博客的介绍页。这个站点使用 VuePress 2、Vite 和 vuepress-theme-hope 构建,适合发布技术笔记、项目复盘、阅读记录与个人文章。
写作方向
- 工程实践:记录真实项目中的取舍、配置和踩坑。
- 工具链:沉淀静态站点、前端构建、自动化发布等流程。
- 长期阅读:把读书、论文和资料整理成可检索的笔记。
联系方式
你可以在 src/.vuepress/theme.ts 中替换作者、邮箱和社交链接。

这里是博客的介绍页。这个站点使用 VuePress 2、Vite 和 vuepress-theme-hope 构建,适合发布技术笔记、项目复盘、阅读记录与个人文章。
你可以在 src/.vuepress/theme.ts 中替换作者、邮箱和社交链接。
本篇目标是让你建立一个整体印象:一个 Spring Boot 后端项目由哪些部分组成,请求是如何被处理的,以及 Spring 在背后帮你做了什么。读完你应该能回答三个问题:
main 方法,应用就能对外提供 HTTP 服务?new,它们是从哪来的?@SpringBootApplication本篇讲「对象」和「数据库表」如何对应,以及怎么用 MyBatis-Plus 优雅地读写数据。读完后你应该能回答:MyBatis-Plus 帮我们省掉了什么?哪些东西仍然需要我们自己写 SQL?分页、事务、关联查询分别是怎么落地的?
ORM(Object-Relational Mapping,对象关系映射)解决一个核心矛盾:Java 是面向对象的,数据库是关系型的(一张张表)。我们希望写业务代码时只操作 Java 对象,而不想每次都手写 Connection / PreparedStatement / ResultSet 那一套 JDBC 样板代码。ORM 框架在中间做翻译:
本篇讲后端权限系统的经典设计:RBAC(Role-Based Access Control,基于角色的访问控制)。本项目就是一套标准的 RBAC,代码全部真实可查。读完本篇,你应该能回答三个问题:权限存在哪、用户有哪些权限是怎么算出来的、一次请求是怎么被拦下来的。
假设直接给用户分配「能否删除用户」这类权限:
用户A ── 能删除用户、能创建用户
用户B ── 能删除用户
用户C ── 能创建用户
这是本项目的核心,也是后端面试高频考点。我们顺着「登录 → 后续请求 → 鉴权」一步步看,先讲清楚概念,再对照真实代码,最后给坑和练习。
很多初学者把这两个词当成一回事,但它们是两件不同的事:
| 概念 | 英文 | 要回答的问题 | 本项目在哪里发生 |
|---|---|---|---|
| 认证 | Authentication | 你是谁?(证明身份) | 登录、BearerToken 校验 |
| 授权 | Authorization | 你能做什么?(权限校验) | PermissionGuard / doGetAuthorizationInfo |
CORS 是前端调用后端接口时最常被卡住的地方。本项目就曾因为 CORS 配置不当,导致登录返回 403 Invalid CORS request——下面用这个真实案例把 CORS 讲透。
浏览器最核心的安全底线之一,就是同源策略。它规定:一个网页里的脚本,只能读取「与自身同源」的资源的响应内容。
两个 URL 必须 协议(scheme)、域名(host)、端口(port)三者全部相同,才算同源。任何一个不同,就是跨源(cross-origin)。
后端不能把 Java 异常堆栈直接甩给前端。统一异常处理让所有错误都返回「结构一致、前端好解析」的 JSON。本章先补一点 Java 异常基础,再看本项目的实现,最后总结常见坑与练习。
先理解异常本身,才知道 Spring 为什么要这样设计。
Throwable
├── Error (严重错误:OutOfMemoryError、StackOverflowError,通常不该捕获)
└── Exception (程序可处理的异常)
├── RuntimeException (运行时异常,unchecked,不强制 try/catch)
│ ├── NullPointerException
│ ├── IllegalArgumentException
│ └── 自定义异常(本项目 BadRequestException / NotFoundException)
└── 受检异常 checked(如 IOException,编译器强制处理)
本篇把「代码」变成「别人能访问的网站」,并解释请求从浏览器到数据库的完整链路。目标读者是完全没接触过容器的新手,所以会先讲清楚几个最基础的概念,再对照本项目真实文件逐行拆解。
很多新手第一次听 Docker 会被一堆名词绕晕,先把最关键的三个讲清楚。
镜像可以理解成「一份打包好、随时能用的软件快照」。它里面包含:操作系统基础、运行环境(Java 17、Node 20 等)、你的代码和启动命令。镜像是静态的、只读的,它就像一张「装机光盘」或「虚拟机模板」。
本篇讲本项目中「资金变动」是怎么处理的:充值、转账、购买扣款,全部建模成命令(Command)经由 RabbitMQ 异步串行处理,模拟银行核心系统的顺序记账。读完本篇你应该能回答:为什么资金操作要异步、消息队列里「交换机 / 队列 / 绑定」分别是什么、单消费者串行处理如何避免余额错乱、以及 HTTP 层与账务层是怎么分工的。
先看一个不用消息队列的「同步」写法:
POST /api/wallet/transfer
-> Controller 校验参数
-> Service 直接:from.balance -= amount; to.balance += amount; 写流水; ← 都在 HTTP 请求线程里完成
-> 返回成功
本篇专门讲清楚一个后端项目里「数据是怎么在层与层之间流动的」:为什么 Controller 不直接返回数据库实体,为什么要有 Request / Response 两种对象,校验是怎么自动发生的,以及实体和 DTO 之间怎么转换。读完你应该能回答:
SysUser 不能直接 return 给前端?UserCreateRequest 上的 @NotBlank、@Email 是什么,谁去执行它?record 写出来的 DTO 和普通的 class 有什么区别?