Spring IOC 容器循环依赖解决(三级缓存)

news2024/11/19 7:26:45

对于循环依赖的解决,首先得了解Spring IOC 容器的创建过程,在加载过程中,Bean 的实例化初始化是分开的,所以在解决循环依赖的问题时,也是基于Bean 的实例化和初始化分开执行这一特点。

  1. 我们将实例化后的Bean 叫 半成品,将初始化后的Bean 叫成品,成品的Bean 可以给外部使用,而半成品的Bean 不能给外部使用。我们在使用三级缓存来解决的时候,正好利用了这一点,将半成品的Bean 提前暴露
    以下是Spring 源码在的三级缓存结构:
    在这里插入图片描述

  2. 三个缓存都是Map结构,而唯一不同的是二级缓存是Map结构的value 参数是个函数式接口ObjectFactory<?>, ObjectFactory<?>是一个函数式接口,仅有一个方法,可以传入lambda表达式,可以是匿名内部类,通i过调用getObject方法来执行具体的逻辑

  3. 三个缓存中分别放不同的value值
    一级缓存放成品对象(实例化+初始化)
    二级缓存存放半成品对象(实例化)
    三级缓存存放对象的lambda 表达式

  4. 在3个缓存中进行对象查找时,依次是通过一级缓存,二级缓存,三级缓存

  5. 三级缓存中使用lambda 表达式的原因是:对象在什么时候被暴露出去或者被其他对象引用是没办法提前确定好的,所以只有在被调用的那刻才可以进行原始对象还是代理对象的判断,使用lambda表达式类似于一种回调机制,不暴露的时候不需要调用执行,当需要被调用的时候,才真正的执行lambda表达式,来判断返回的到底是代理对象还是原始对象

引申问题

  1. 如果只有一个map结构,能解决循环依赖问题吗?
    理论上可行,实际上没人这么干,使用两个map的意义在于将成本对象和半成品对象进行区
    分,半成品对象是不能直接暴露给外部对象使用的,可以设置标志位来标识成品还是半成品,
    是操作起来比较麻烦,所以直接用两个map即可

  2. 如果只有两个map结构,能解决循环依赖问题吗?
    可以解决,但是有前提:没有代理对象的时候,当不使用aop的时候,两个缓存map就可以解决
    循环依赖问题

  3. 为什么使用三级缓存之后就可以解决带aop的循环引用?
    《1》一个容器中,能包含同名的两个对象吗?
    不能
    《2》对象创建过程中,原始的对象有没有可能需要生成代理对象?

    《3》如果创建出了代理对象,那么程序在调用的时候到底使用原始对象还是代理对象?
    应该用代理对象,但是程序是死的,是提前写好的,他怎么知道要选择代理对象呢?
    所以,当出现代理对象的时候,要使用代理对象替换掉原始对象
    《4》代理对象的创建实在初始化过程的扩展阶段,而属性的赋值是在生成代理对象之前执行的
    那怎么完成替换呢?
    需要在属性赋值的时候判断是否需要生成代理对象
    《5》那为什么非要使用lambda表达式的机制来完成呢?
    对象在什么时候被暴露出去或者被其他对象引用是没办法提前确定好的,所以只有在被调用的那
    刻才可以进行原始对象还是代理对象的判断,使用lambda表达式类似于一种回调机制,不暴露
    的时候不需要调用执行,当需要被调用的时候,才真正的执行lambda表达式,来判断返回的到底
    是代理对象还是原始对象

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

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

相关文章

2024中国闪存市场观察:AI助推闪存全面起势?

过去两年&#xff0c;闪存市场一直处于低迷状态&#xff0c;但去年第四季度闪存颗粒资源的上涨&#xff0c;导致闪存产品价格一路上扬&#xff0c;市场遂发生反转。 2024年&#xff0c;中国闪存市场会彻底走向复苏&#xff0c;还是急转直下&#xff1f;中国AI热潮&#xff0c;…

JavaScript原型、原型对象、原型链系列详解(五)

(五)、JavaScript原型设计模式 什么是JavaScript原型设计模式&#xff1f; 为什么要使用JavaScript原型设计模式&#xff1f; JavaScript原型设计模式的实现方法有哪些&#xff1f; JavaScript原型设计模式的应用场景是什么&#xff1f; 什么是JavaScript原型设计模式&#xff…

Raft 共识算法

什么是木筏&#xff1f; Raft 是一种共识算法&#xff0c;旨在易于理解。它 在容错和性能方面与Paxos相当。不同之处在于 它被分解成相对独立的子问题&#xff0c;而且它干净利落 解决了实际系统所需的所有主要部分。我们希望 Raft 能使 更广泛的受众可以达成共识&#xff0c;并…

【网站项目】303老年人的景区订票系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

主流公链 - Cosmos

探索Cosmos区块链&#xff1a;构建互联的区块链网络 1. Cosmos简介 Cosmos是一个开放的区块链互联协议&#xff0c;旨在解决区块链之间的孤立性问题。它的愿景是构建一个可以互相通信和互操作的区块链网络&#xff0c;实现资产和数据的流动性。在Cosmos中&#xff0c;不同的区…

langchain调用语言模型chatglm4从智谱AI

目录 ​0.langchain agent 原理 ReAct 1.langchain agent使用chatgpt调用tools的源代码 2.自定义本地语言模型的代码 3.其他加速方法 背景&#xff1a;如果使用openai的chatgpt4进行语言问答&#xff0c;是需要从国内到国外的一个客户请求-->openai服务器response的一个…

使用Nginx1.25.4版本做负载均衡、搭建Nacos2.3.0服务集群

关于使用版本问题上&#xff0c;其实小白更喜欢使用新的版本&#xff0c;因为新的版本功能更多&#xff0c;肯定优化方面不言而喻&#xff0c;懂得都懂&#xff0c;但是新的版本&#xff0c;肯定使用起来更加的速度&#xff0c;性能&#xff0c;也是不言而喻的啊&#xff0c;那…

力扣--并查集684.冗余连接

思路分析&#xff1a; 首先定义了一个Solution类&#xff0c;包含了私有成员变量fa[1001]和n&#xff0c;以及三个私有成员函数find()、togother()和findRedundantConnection()。 find()函数用于查找节点的根节点&#xff08;即所在连通分量的代表节点&#xff09;&#xff0c…

2024最新华为OD机试试题库全 -【二叉树的广度搜索】- C卷

1. 🌈题目详情 1.1 ⚠️题目 有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。 现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。 1.2 🔣输入要求 每个输入文…

CMC学习系列 (2):EEG-EMG有可能作为运动恢复的生物标志物

CMC学习系列:EEG-EMG有可能作为运动恢复的生物标志物 0. 引言1. 主要贡献2. 方法2.1 显著 bins 数量2.2 偏侧性指数 3. 结果3.1 临床评估3.2 CMC3.3 卒中后CMC随时间变化 4. 讨论和结论5. 总结欢迎来稿 论文地址&#xff1a;https://www.frontiersin.org/journals/neurology/ar…

信号处理--基于混合CNN和transfomer自注意力的多通道脑电信号的情绪分类的简单应用

目录 关于 工具 数据集 数据集简述 方法实现 数据读取 ​编辑数据预处理 传统机器学习模型(逻辑回归&#xff0c;支持向量机&#xff0c;随机森林) 多层感知机模型 CNNtransfomer模型 代码获取 关于 本实验利用结合了卷积神经网络 (CNN) 和 Transformer 组件的混合…

在DasViewer里怎么查看三维模型的坐标系?

量测就可以查看坐标系了&#xff0c;或者查看xml文件中坐标系的代号。量测就可以查看坐标系了&#xff0c;或者查看xml文件中坐标系的代号。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅…

Go语言学习Day3:数据类型、运算符与流程控制

名人说&#xff1a;莫愁千里路&#xff0c;自有到来风。 ——钱珝 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据类型①布尔类型②整型③浮点型④string⑤类型转换 2、运算符①算术运算符②逻辑运算符③关…

STM32学习笔记(6_8)- TIM定时器的编码器接口代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

원클릭으로 주류 전자상거래 플랫폼 상품 상세 데이터 수집 및 접속 시연 예제 (한국어판)

클릭 한 번으로 전자상거래 플랫폼 데이터를 캡처하는 것은 일반적으로 웹 페이지에서 정보를 자동으로 추출 할 수있는 네트워크 파충류 기술과 관련됩니다.그러나 모든 형태의 데이터 수집은 해당 웹 사이트의 사용 약관 및 개인 정보 보호 정책 및 현지 법률 및 규정을 준수…

百度蜘蛛池平台在线发外链-原理以及搭建教程

蜘蛛池平台是一款非常实用的SEO优化工具&#xff0c;它可以帮助网站管理员提高网站的排名和流量。百度蜘蛛池原理是基于百度搜索引擎的搜索算法&#xff0c;通过对网页的内容、结构、链接等方面进行分析和评估&#xff0c;从而判断网页的质量和重要性&#xff0c;从而对网页进行…

JAVA面试大全之基础篇

目录 1、语法基础 1.1、面向对象特性&#xff1f;​​​​​​​ 1.2、a a b 与 a b 的区别 1.3、3*0.1 0.3 将会返回什么? true 还是 false? 1.4、能在 Switch 中使用 String 吗? 1.5、对equals()和hashCode()的理解? 1.6、final、finalize 和 finally 的不同之…

【物联网开源平台】tingsboard二次开发

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…

怎么清理苹果电脑内存?CleanMyMac X4.15.2最新中文版使用教程

近日&#xff0c;我的苹果电脑似乎遭遇了一点小麻烦&#xff0c;每当深入工作或沉浸于娱乐之时&#xff0c;突如其来的一个警告弹窗就像一颗冰凉的霰弹&#xff0c;打断了我所有的思绪&#xff1a;内存不足&#xff01;&#xff01;&#xff01;怎么清理苹果电脑内存&#xff0…

机器学习——神经网络简单了解

一、神经网络基本概念 神经网络可以分为生物神经网络和人工神经网络 (1)生物神经网络,指的是生物脑内的神经元、突触等构成的神经网络&#xff0c;可以使生物体产生意识&#xff0c;并协助生物体思考、行动和管理各机体活动。 (2)人工神经网络,是目前热门的深度学习的研究…