烟台做网站价格/重庆seo网站管理

烟台做网站价格,重庆seo网站管理,网站程序组成,网络科技公司是骗人的吗文章目录 1. 什么是循环依赖?1.1 概念解析1.2 示例代码 2. 循环依赖的类型2.1 构造器循环依赖(不可解决 ❌)2.2 Setter 方式或 Autowired 方式的循环依赖(可解决 ✅) 3. 解决循环依赖的方式3.1 方式一:使用…

文章目录

    • 1. 什么是循环依赖?
      • 1.1 概念解析
      • 1.2 示例代码
    • 2. 循环依赖的类型
      • 2.1 构造器循环依赖(不可解决 ❌)
      • 2.2 Setter 方式或 `@Autowired` 方式的循环依赖(可解决 ✅)
    • 3. 解决循环依赖的方式
      • 3.1 方式一:使用 `@Lazy`(延迟加载) 🚀
      • 3.2 方式二:修改依赖关系 🛠️
      • 3.3 方式三:使用 `@PostConstruct` 进行初始化 🎯
      • 3.4 方式四:使用 `ApplicationContextAware` 直接获取 Bean ⚙️
    • 4. 结论与最佳实践 🏆

1. 什么是循环依赖?

1.1 概念解析

在 Spring 容器中,循环依赖(Circular Dependency) 是指:

  • Bean A 依赖 Bean B
  • Bean B 依赖 Bean A
  • 这种情况下,Spring 在创建 Bean 时会出现互相等待,可能导致异常。

1.2 示例代码

@Component
public class A {private final B b;@Autowiredpublic A(B b) {this.b = b;}
}@Component
public class B {private final A a;@Autowiredpublic B(A a) {this.a = a;}
}

💥 错误信息:

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'A': Requested bean is currently in creation:
Is there an unresolvable circular reference?

2. 循环依赖的类型

2.1 构造器循环依赖(不可解决 ❌)

  • 通过构造方法互相依赖,Spring 无法提前暴露 Bean 实例,因此会直接报错。
  • 示例:(上面代码就属于此类)

2.2 Setter 方式或 @Autowired 方式的循环依赖(可解决 ✅)

  • Spring 默认支持这种循环依赖(单例模式下)。
  • 示例:
@Component
public class A {private B b;@Autowiredpublic void setB(B b) {this.b = b;}
}@Component
public class B {private A a;@Autowiredpublic void setA(A a) {this.a = a;}
}

📌 Spring 解决方式:

  • 一级缓存(singletonObjects): 存放完全实例化的 Bean。
  • 二级缓存(earlySingletonObjects): 存放提前暴露的半成品 Bean。
  • 三级缓存(singletonFactories): 存放创建 Bean 的工厂,以支持代理(如 AOP 代理)。

3. 解决循环依赖的方式

3.1 方式一:使用 @Lazy(延迟加载) 🚀

  • 只在需要时才创建 Bean,避免初始化时发生循环依赖。
@Component
public class A {private final B b;@Autowiredpublic A(@Lazy B b) {this.b = b;}
}

适用于构造器注入,但不能解决所有情况。

3.2 方式二:修改依赖关系 🛠️

  • 重新设计 Bean 关系,避免直接互相依赖。
  • 可以通过 引入中间层(如事件监听模式、消息队列等) 解决。

3.3 方式三:使用 @PostConstruct 进行初始化 🎯

  • 让 Spring 先创建 Bean,然后在初始化时再注入依赖。
@Component
public class A {private B b;@Autowiredpublic A() {}@PostConstructpublic void init() {this.b = SpringContextUtil.getBean(B.class);}
}

避免构造方法循环依赖,适用于某些场景。

3.4 方式四:使用 ApplicationContextAware 直接获取 Bean ⚙️

@Component
public class A implements ApplicationContextAware {private B b;private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}@PostConstructpublic void init() {this.b = applicationContext.getBean(B.class);}
}

适用于特定场景,但不推荐滥用 ApplicationContext,影响 Spring 设计模式。

4. 结论与最佳实践 🏆

方案适用情况备注
@Lazy适用于构造器循环依赖延迟加载可能会影响性能
修改依赖结构推荐最优方案,从根本上解决问题
@PostConstruct适用于部分场景但可能导致依赖获取不直观
ApplicationContext 获取 Bean可行但不推荐破坏 Spring 设计模式

🎯 最佳实践:

  1. 避免构造器循环依赖,优先使用 @Autowired 方式。
  2. 重构业务逻辑,减少不必要的循环依赖。
  3. 若无法避免,尝试 @Lazy@PostConstruct 方案。
  4. **尽量不使用 ApplicationContextAware,防止耦合过高。 **

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium@1.126.0,创建3D瓦片,修改样式

第一步:添加3D建筑 Cesium.createOsmBuildingsAsync()这是一个异步方法,所以要写在一个异步函数里 创建一个函数 const create3DBuilding async (viewer) > {try {// 添加3D建筑const tileset await Cesium.createOsmBuildingsAsync();viewer.scen…

基于 C++ Qt 的 Fluent Design 组件库 QFluentWidgets

简介 QFluentWidgets 是一个基于 Qt 的 Fluent Designer 组件库,内置超过 150 个开箱即用的 Fluent Designer 组件,支持亮暗主题无缝切换和自定义主题色。 编译示例 以 Qt5 为例(Qt6 也支持),将 libQFluentWidgets.d…

React 源码揭秘 | 更新队列

前面几篇遇到updateQueue的时候,我们把它先简单的当成了一个队列处理,这篇我们来详细讨论一下这个更新队列。 有关updateQueue中的部分,可以见源码 UpdateQueue实现 Update对象 我们先来看一下UpdateQueue中的内容,Update对象&…

[SQL] 事务的四大特性(ACID)

🎄事务的四大特性 以下就是事务的四大特性,简称ACID。 原子性📢事务时不可分割的最小操作单元,要么全部成功,要么全部失败。一致性📢事务完成后,必须使所有的数据都保持一致隔离性&#x1f4e2…

DeepSeek 提示词:基础结构

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

Apache DolphinScheduler系列1-单节点部署及测试报告

文章目录 整体说明一、部署环境二、版本号三、部署方案四、部署步骤4.1、上传部署包4.2、创建外部数据库4.3、修改元数据库配置4.4、上传MySQLl驱动程序4.5、初始化外部数据库4.6、启停服务4.7、访问页面五、常见问题及解决方式5.1、时间不一致5.2、异常终止5.3、大量日志5.4、…

LLM之论文阅读——Context Size对RAG的影响

前言 RAG 系统已经在多个行业中得到广泛应用,尤其是在企业内部文档查询等场景中。尽管 RAG 系统的应用日益广泛,关于其最佳配置的研究却相对缺乏,特别是在上下文大小、基础 LLM 选择以及检索方法等方面。 论文原文: On the Influence of Co…

LLaMA-Factory|微调大语言模型初探索(4),64G显存微调13b模型

上篇文章记录了使用lora微调deepseek-7b,微调成功,但是微调llama3-8b显存爆炸,这次尝试使用qlora微调HQQ方式量化,微调更大参数体量的大语言模型,记录下来微调过程,仅供参考。 对过程不感兴趣的兄弟们可以直…

详解Redis如何持久化

引言 本文介绍了 Redis 的两种持久化方式:RDB 和 AOF。RDB 按时间间隔快照存储,AOF 记录写操作。阐述了它们的配置、工作原理、恢复数据的方法、性能与实践建议,如降低 fork 频率、控制内存等,还提到二者可配合使用,最…

HarmonyOS Design 介绍

HarmonyOS Design 介绍 文章目录 HarmonyOS Design 介绍一、HarmonyOS Design 是什么?1. 设计系统(Design System)2. UI 框架的支持3. 设计工具和资源4. 开发指南5. 与其他设计系统的对比总结 二、HarmonyOS Design 特点 | 应用场景1. Harmon…

Java 大视界 -- 基于 Java 的大数据机器学习模型压缩与部署优化(99)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

算法-图-数据结构(邻接矩阵)-BFS广度优先遍历

邻接矩阵广度优先遍历(BFS)是一种用于遍历或搜索图的算法,以下是具体介绍: 1. 基本概念 图是一种非线性的数据结构,由顶点和边组成,可分为无向图、有向图、加权图、无权图等。邻接矩阵是表示图的一种数…

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用

ARM Cortex-M3 技术解析:核寄存器R1-R15介绍及使用 作为嵌入式开发领域的经典处理器内核,ARM Cortex-M3(CM3)凭借其高效能、低功耗和丰富特性,在工业控制、物联网、消费电子等领域广泛应用。而内核寄存器是我们调试代…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用:生成结构化PPT大纲(擅长逻辑构建与内容优化)Kimi核心作用:将文本转换为视觉化PPT(提供模板库与排版引擎) 二、操作步骤详解 1. 通…

Redis|持久化

文章目录 总体介绍RDB(Redis DataBase)官网介绍案例演示优势劣势如何检查修复 dump.rdb 文件哪些情况下会触发 RDB 快照如何禁用快照RDB 优化配置项详解小总结 AOF(Append Only File)官网介绍是什么能干嘛AOF 持久化工作流程AOF 缓…

巨控科技的GRM550元出魔抗实现PLC远程下载与维护方案:工业自动化的高效解决方案

巨控科技PLC远程下载与维护方案:工业自动化的高效解决方案 在工业自动化领域,设备的高效维护与快速调试是保障生产连续性的关键。巨控科技推出的PLC远程下载与维护方案,凭借其先进的技术和广泛兼容性,成为企业实现设备远程管理的…

ChatGLM2-6B如何从输入到输出-代码解析(二)

出发点 上一篇解析了Chatglm2-6b的模型架构,并和Chatglm-6b进行对比,但是留下了几个问题(哭)这一篇的目的是讲明白attention和rotaryEmbedding,解决问题,并实现整体目标,完全替代modeling_chat…

Sublime Text4安装、汉化

-------------2025-02-22可用---------------------- 官方网址下载:https://www.sublimetext.com 打开https://hexed.it 点击打开文件找到软件安装目录下的 ctrlf 查找 8079 0500 0f94 c2右边启用替换替换为:c641 0501 b200 90点击替换按钮 替换完成后 另存为本地…

汽车开放系统架构(AUTOSAR)中运行时环境(RTE)生成过程剖析

一、引言 在当今高度智能化的汽车电子领域,软件系统的复杂性呈指数级增长。为了应对这一挑战,汽车开放系统架构(AUTOSAR)应运而生,它为汽车电子软件开发提供了标准化的分层架构和开发方法。其中,运行时环境…

stm32仿真 74hc238流水灯 数码管动态数字显示

f103c6t6a_hex文件 #include "main.h"![请添加图片描述](https://i-blog.csdnimg.cn/direct/8c0d44b121134cf08f5186df316ea07f.gif)#include "stdlib.h"void SystemClock_Config(void); static void MX_GPIO_Init(void); // 自定义abc引脚 #define A_PIN…