Spring 事务为什么会失效
这篇按踩坑笔记来写,因为 Spring 事务为什么会失效 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话事务依赖代理、异常类型和数据库能力。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:复现 self-invocation 导致事务不生效。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。 这次...
依赖注入和循环依赖问题复盘
今天不想写长文,先把 依赖注入和循环依赖问题复盘 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论循环依赖通常暴露了职责边界不清。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 构造器注入更容易暴露问题。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 懒加载只是缓解不是设计。我现在的...
AOP 适合解决什么问题
这篇按踩坑笔记来写,因为 AOP 适合解决什么问题 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话AOP 适合横切关注点,不适合隐藏核心业务流程。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:实现一个记录接口耗时的注解和切面。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。 这次我想盯住的坑 ...
Bean 生命周期我目前理解到哪一步
今天把 Bean 生命周期我目前理解到哪一步 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住从实例化、依赖注入、初始化到销毁串起 Bean 生命周期。 我这次真正记住的点 构造方法不适合访问未注入依赖 初始化逻辑要可重复执行 销毁阶段释放资源 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到...
Spring 配置文件和多环境管理
这篇我想按“排查记录”来写,主题是 Spring 配置文件和多环境管理。这种写法比纯概念文更适合我自己回看。 现象先别急着解释把环境差异收敛到配置,把敏感信息交给部署环境。 先把现象钉住,比急着下结论有用。很多时候真正的关键不是“答案是什么”,而是“我是怎么一步步排到这里的”。 我会先看哪几件事 profile 区分环境 默认值要谨慎 密码密钥不要写进仓库 带入一个排查场景整理 dev、test、prod 三套数据库配置。 如果...
参数校验应该放在哪一层
这篇按踩坑笔记来写,因为 参数校验应该放在哪一层 我现在更容易记住“错在哪”,而不是“定义长什么样”。 先记住这句话格式校验靠入口,业务规则靠领域或服务层。 很多问题不是不会用,而是用得太顺手了,顺手到把边界条件给省掉了。 这类问题一般怎么出现我脑子里会先放这个场景:实现新增商品接口的入参校验和库存规则校验。 一开始看着都像是个小问题,真正麻烦的是它往往不是立刻报错,而是跑一阵子、数据一多、并发一上来才暴露。 这次我想盯住的坑 空...
全局异常处理的一次整理
今天不想写长文,先把 全局异常处理的一次整理 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。 先说我自己的结论把异常转换集中到边界层,让业务代码专注表达失败原因。 我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。 快问快答 参数异常返回明确字段。我现在的理解:先记结论,再回到代码里找一个能验证它的场景。 业务异常返回业务码。...
统一返回结果是否真的有必要
今天把 统一返回结果是否真的有必要 补成一篇正常一点的学习笔记,不写大而全,就记我这轮最想吃透的部分。 一句话先立住统一格式能降低前端处理成本,但要保留 HTTP 语义。 我这次真正记住的点 成功和失败结构一致 错误码要稳定 下载流等场景不要强套 为什么我会专门记这块因为它很容易出现一种错觉:看资料的时候觉得自己会了,真到写接口、改 SQL、配事务、看线程池参数时又开始发虚。 我现在尽量把知识点挂到一个具体场景上:设计统一返回对...