@Lazy 关键字解决循环依赖

发布时间:2026/10/14 3:50:48

@Lazy 关键字解决循环依赖 循环依赖报错为什么给构造器参数加个 Lazy 就好了朋友的代码炸在启动阶段日志第一行是这个The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | orderService defined in file [.../OrderService.class] ↑ ↓ | payService defined in file [.../PayService.class] └─────┘我让他给构造器参数加了个Lazy启动就过了。他更懵了加个注解循环依赖就没了一、构造器循环为什么必死两个 Service 互相依赖都用构造器注入ServicepublicclassOrderService{privatefinalPayServicepayService;publicOrderService(PayServicepayService){this.payServicepayService;}}ServicepublicclassPayService{privatefinalOrderServiceorderService;publicPayService(OrderServiceorderService){this.orderServiceorderService;}}Spring 的套路是先实例化再填充属性而构造器注入把这个顺序卡死了参数没凑齐new都执行不了。Spring: 创建 orderService │ new OrderService( ? ) ← payService 还没有 ▼ Spring: 创建 payService │ new PayService( ? ) ← orderService 也没有 ▼ Spring: 回头再要 orderService ✗ 还在创建中连个半成品实例都没留下 → BeanCurrentlyInCreationException关键就是最后一行Spring 手里连个半成品都没有。字段注入之所以没事是因为它先new出一个半成品丢进缓存回头有人来要就把这个半成品递过去构造器注入参数没齐就不能new缓存里空空的只能报错。顺便说一句Spring Boot 2.6 之后循环依赖默认就被禁止了但打开spring.main.allow-circular-references也救不了构造器循环——这不是允不允许的问题而是物理上没有半成品可给。二、Lazy 给的是一个空壳代理改动只有一行publicOrderService(LazyPayServicepayService){this.payServicepayService;}因为它注入的根本不是PayService而是一个代理空壳——没有业务逻辑只记着一句话“真身叫 payService用的时候去容器里取。”Spring: 创建 orderService │ new OrderService( 空壳代理 ) ← 有东西塞得进去构造器能执行 ▼ orderService 出生 ✅ payService 还没被创建也无所谓 ……很久以后业务代码调用 orderService.getPayService().pay()…… 代理被第一次戳醒 → getBean(payService) → 这时候才真正 new PayService │ ▼ payService 的构造器要找 orderService → 容器里早就有了 ✅一句话Lazy把创建 B从 A 的构造期推迟到了 A 使用 B 的那一刻。循环并没有被打断只是被拉平在时间轴上前后错开了。原理也就是一层窗户纸Spring 看到注入点上有Lazy就用ProxyFactory现场捏一个代理代理里挂着TargetSource它的getTarget()本质上就是一句getBean(targetBeanName)。接口走 JDK 动态代理类走 CGLIB 子类代理所以getClass()打出来多半是PayService$$EnhancerBySpringCGLIB$$...这种名字看到别慌。三、两个坑别在构造器里调用代理的方法。这一戳等于立刻要真身而对方回头又要你BeanCurrentlyInCreationException原地复活。代理是用的时候才生效不是随时都能用。写在类上的Lazy不管用。那是延迟初始化换的是什么时候创建不是注入什么。只有写在注入点构造器参数、字段、setter上才真的把注入物换成了空壳。另外它是止血带不是接骨药两个 Service 互相依赖往往说明职责切歪了——先让服务跑起来再腾出手把设计改干净。总结成一句话构造器注入要求依赖现成Lazy偏偏递给你一个不现成的空壳于是循环被推到了以后。
延伸阅读

更多相关文章

2026/10/14 3:45:47

重症ICU数据库四大核心坑点与宽表构建实战指南

简介:本资源是面向医学信息学研究者、临床科研人员及医疗AI开发者的重症医学数据库选型与接入指南项目源码包,解决多源异构重症数据获取门槛高、申请流程不清晰、技术适配难等实际问题。压缩包共3个文件(6KB),含HTML格…

2026/10/14 3:45:47

GNSS与大地水准面模型的高程测量技术实践

1. 项目背景与核心价值高程测量一直是测绘工程中的基础性工作,传统水准测量虽然精度高,但存在作业效率低、成本高的痛点。我在参与西南某山区铁路勘测项目时,首次尝试将GNSS观测数据与大地水准面模型结合,实现了测区内85%区域的高…

2026/10/14 3:45:47

GCN-LSTM交通预测实战:从原理到数据处理的完整解析

简介:面向智能交通时空预测与图神经网络应用,这套资料提供GCN-LSTM组合模型的完整Python实现和配套数据集,适合有深度学习基础、想快速复现时空预测实验的研究者。包内共74个文件,含Python源码、CSV数据、配置文件、示例图片等&am…

2026/10/14 4:50:50

Pandas生态贯通:NumPy、Matplotlib与Scikit-learn数据流程实战

很多人学数据分析,喜欢一个库一个库地啃:先学NumPy,再学Pandas,又学Matplotlib,最后还报了个课学Scikit-learn。单看每个库的教程都能看懂,可真到项目里,一份CSV文件摆在面前,要清洗…

2026/10/14 4:50:50

本地跑27B大模型实测:159 tok/s如何实现与AI编程体验

最近我在折腾本地大模型,把 Qwen3.8-27B 跑到了 159 tok/s。先说结论:这个速度已经接近甚至超过了部分云端 API 的响应体验,但“能不能替代云端”这个问题,答案没这么简单。这篇帖子就围绕这个标题,聊聊我实测的硬件配…

2026/10/14 4:50:50

NetApp FAS8300企业级存储安装与ONTAP初始化实战指南

简介:本资源是NetApp FAS8300企业级存储系统的官方级安装与配置实践指南,面向存储运维工程师、系统集成实施人员及中高级SAN/NAS架构学习者,聚焦真实交付场景中的初始化部署、高可用集群构建与多协议统一管理等核心任务。压缩包为单文件PDF文…

2026/10/14 4:50:50

Qt表格与Excel互转实战:QXlsx方案选型、导出导入与避坑指南

1. 从一次数据交付返工说起:为什么表格与Excel的互转值得认真对待做过桌面端数据管理工具的人,大概都遇到过这样的场景:用户用你的软件录了一整天的数据,临走前问一句“能导出成Excel吗,我要发给同事汇总”。如果你当时…

2026/10/14 4:45:50

LLM Agent可观测性实战:Tracing、Evals与成本追踪一体化落地

1. 这不是“又一个AI监控工具”,而是LLM应用落地的生存指南你有没有遇到过这样的情况:模型在测试环境里回答得头头是道,一上线就频繁“胡言乱语”;用户投诉说“昨天还能正常用,今天突然卡住半天没反应”;运…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑