Lazy能否有效解决循环依赖?答案比你想的复杂

原文来自于:zha-ge.cn/java/115

Lazy能否有效解决循环依赖?答案比你想的复杂

记得有一次项目重构,刚好碰上了两个Bean「互相喜欢」的情境。A 里面要用 B,B 里面又要用 A。典型的循环依赖嘛。Spring 启动直接报错,像极了早恋被班主任逮住。

同事提了个办法:用 @Lazy!可行吗?说真的,当时我信了半截......


故事是这样的

我老老实实在A和B上都加了 @Lazy,美滋滋地以为一切OK。代码大概这样:

java 复制代码
@Component
public class A {
    @Autowired
    @Lazy
    private B b;
    // ...
}

B里面也来一手,但是看到这里你可能都能猜到,心态飘了。


踩坑瞬间

真相只有一个:不是所有循环依赖,@Lazy 都能救场!

现场踩雷清单:

  • 场景判断题:如果你用的是单例,Spring 的确能"缓一口气";多例(prototype)?直接GG。
  • @Lazy 不是万能钥匙。构造器注入碰循环依赖,@Lazy 小手一抖表示爱莫能助------除非你换回 setter 或 field 注入。
  • 有些框架(比如MyBatis-Plus)暗中搞"花式注入",你以为加了@Lazy,实际根本没进Spring默认处理流程!

我在开发环境跑了一下,结果:

构造器注入 setter/field注入
单例 GG 可以试试
多例 全晕 全晕

最后,循环依赖的故事变成了:@Lazy 不是灵丹妙药,是保姆级平衡剂,有用时能帮买瓶可乐,没用的时候就像一瓶开了盖的雪碧------气全没了。


探索过的骚操作

当然,身为不服输的程序猿,怎么可能直接认栽!

  • 把构造器注入都换成setter注入,项目里一堆代码火山爆发似的改......
  • ApplicationContextAware手搓IoC,各种 getBean,堪称反直觉大合集。
  • 重构业务逻辑,干脆避免"你中有我、我中有你"------这才是治本之道!

非要顶着循环依赖么?那就认认真真查到底是不是业务设计就不行。


经验启示

聊到最后,如果你正撸着咖啡想着用@Lazy优雅化解循环依赖,请务必牢记:

  • 先看注入方式,再用@Lazy,别让自己踩进构造器注入的深坑;
  • 能重构就重构,循环依赖本来就不优雅;
  • 碰到多例Bean循环依赖,甭想了,赶紧调整设计;

总归一句话:@Lazy 能解一时之急,解不了结构性的矛盾。写代码嘛,咱既要有巧劲,也要有狠劲。


吹到这儿,故事就到这。你有没有用@Lazy踩过坑?欢迎评论区互相嘲笑、安慰、抱团取暖~

相关推荐
星空椰5 分钟前
JavaScript基础:运算符和流程控制
开发语言·javascript·ecmascript
BingoGo23 分钟前
Laravel13 + Vue3 的免费可商用 PHP 管理后台 CatchAdmin V5.2.0 发布
后端·php·laravel
studyForMokey27 分钟前
【Android面试】Glide专题
android·面试·glide
窝子面35 分钟前
NestJs+MongoDB+Deepseek+Langchain实现ai聊天助手
javascript·数据库·人工智能·mongodb
人道领域40 分钟前
【LeetCode刷题日记】15.三数之和(梦破碎的地方)
算法·leetcode·面试
吴声子夜歌1 小时前
ES6——Calss详解
javascript·es6·原型模式
rannn_1111 小时前
【Redis|高级篇1】分布式缓存|持久化(RDB、AOF)、主从集群、哨兵、分片集群
java·redis·分布式·后端·缓存
❆VE❆1 小时前
虚拟列表原理与实战运用场景详解
前端·javascript·css·vue.js·html·虚拟列表
weixin_408099671 小时前
【实战教程】EasyClick 调用 OCR 文字识别 API(自动识别屏幕文字 + 完整示例代码)
前端·人工智能·后端·ocr·api·安卓·easyclick
添尹1 小时前
Go语言基础之指针
开发语言·后端·golang