

























Spring Boot 3.x 循环依赖实战:从 allow-circular-references 到纯 DAG ,一个支付系统的重构之旅
项目背景:Jeepay 计全支付,Spring Boot 3.3.7 + MyBatis-Plus + Vue 3 ,多模块 Maven 项目。
原本前后端分离部署( Nginx + 独立前端容器),想把前端 dist 直接打进 JAR 简化部署。几个坑:
三个模块的 fat JAR 共 288MB ,其中 130 个公共依赖(72MB) 重复存储 3 次。方案:
去掉 allow-circular-references: true 后直接启动,Spring Boot 3.x 严格检测报出完整依赖链:
┌─────┐ │ SysConfigService 自引用 (删 @Autowired self ,直接用 this) ↑ ↓ │ IsvInfoService 自引用 (同上)
修复策略:
关键认知:
依赖只能单向流动。找到"谁在反向调用"就是断环点。
大多数循环依赖是 CRUD 委托导致的。ServiceImpl 包装 BaseMapper ,循环往往是因为 A 需要 B 的 getById(),B 需要 A 的 count()——直接用 Mapper 替代 Service 注入,不改任何业务逻辑。
不要用 @Lazy 、不要用 allow-circular-references ,这些都是掩耳盗铃。Spring Boot 3.x 默认禁止循环是为了逼你写出正确的分层。
最终效果
┌───────────────────────────┬────────┬───────────────┐ │ 指标 │ 修复前 │ 修复后 │ ├───────────────────────────┼────────┼───────────────┤ │ 发行包大小 │ 260 MB │ 120 MB (-54%) │ ├───────────────────────────┼────────┼───────────────┤ │ 循环依赖 │ 5 个 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ allow-circular-references │ true │ 已移除 │ ├───────────────────────────┼────────┼───────────────┤ │ @Lazy │ 2 处 │ 0 │ ├───────────────────────────┼────────┼───────────────┤ │ 启动时间 │ ~8s │ ~4s │ └───────────────────────────┴────────┴───────────────┘
1 5wunianOP 还增加了 openlist 的 s3 存储支持。 |
3 5wunianOP 从开源建立的 jeepay ,到商业片的发行包,中间有一大堆需要配置配置的东西。为此做了大量的自动化部署工具脚本。 |
4 5wunianOP 目前已经完成了一个应用接入支付。有需要接入支付的,可以联系,提供技术支持。 |
5 5wunianOP 已经完成了支付备案,网站备案,可以完成全链路的动作。 |
6 Mandyer 4 天前YW9odW4yMDE4QGdtYWlsLmNvbQ== |
9 5wunianOP 将生产环境配置和 local 环境打包方案更新了一下。毕竟 java 上部署方案动不动就是几百兆。一个包动不动就是几十兆。这就是源头上 java 的差距离。没有把未使用的代码干掉。目前只是 lib 包共享,就直接降了一倍的分发包体积。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。