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

对于循环依赖的解决,首先得了解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表达式,来判断返回的到底
    是代理对象还是原始对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web自动化】Selenium的使用(一)

目录 关于自动化测试selenium工作机制 selenium的使用selenium中常用API定位元素按id定位按名称定位按类名定位按标签名定位按CSS选择器定位按XPath定位示例 操作测试对象等待sleep休眠隐式等待显示等待 打印信息浏览器操作键盘事件鼠标事件切换窗口截图关闭浏览器 欢迎阅读本文…

Windows 11 专业版 23H2 Docker Desktop 下载 安装 配置 使用

博文目录 文章目录 Docker Desktop准备系统要求 (WSL 2 backend)在 Windows 上打开 WSL 2 功能先决条件开启 WSL 2 WSL下载安装启动配置使用镜像 Image卷积 Volumes容器 Containers 命令RedisMySQLPostGreSQL Docker Desktop Overview of Docker Desktop Docker Desktop 疑难解…

揭秘五五复制模式,助力平台用户快速裂变至百万级!

你是否时常为平台的用户增长缓慢而倍感压力&#xff1f;是否渴望找到一种方法&#xff0c;让平台用户迅速扩张&#xff0c;实现百万级用户量的突破&#xff1f;今天&#xff0c;我将为大家揭晓一种创新的商业模式——五五复制模式&#xff0c;它或许能成为你实现梦想的关键。 五…

位运算

本文用于记录个人算法竞赛学习&#xff0c;仅供参考 目录 一.n的二进制表示中第k位x 二.通过lowbit操作返回x的最后一位1 1.lowbit实现&#xff1a;x & (-x) 2. lowbit具体作用 一.n的二进制表示中第k位x n 15 &#xff08;1111&#xff09;2 操作&#xff1a;1.x …

Redis主从同步机制

一、步骤如下&#xff1a;&#xff08;全量&#xff09; 1.从服务器向主服务器发送同步命令 sync&#xff1b; 2.主数据库接收到同步命令后&#xff0c;会执行 bgsave 命令&#xff0c;在后台生成一个 rdb 文件&#xff0c;并使用一个缓冲区记录从现在开始执行的所有写命令&a…

苏州金龙新V系客车创新打造,剑指新标杆

诞生于2004年的苏州金龙V系客车在20年时间里销售了6万多辆&#xff0c;用户超过5000家&#xff0c;用户的反复选择体现了它超强的产品力。3月下旬&#xff0c;全新打造的苏州金龙新V系客车震撼登场&#xff0c;拥趸们发现&#xff0c;该系列客车在智能化、网联化及设计语言方面…

如何使用剪映专业版剪辑视频

1.操作界面功能介绍 2.时间线的使用 拖动前端后端缩减时长&#xff0c;有多个素材可以拖动调节前后顺序拼接。 分割视频 删除

基于无迹卡尔曼滤波的路面附着系数估计算法

基于无迹卡尔曼滤波的路面附着系数估计算法 附赠自动驾驶学习资料和量产经验&#xff1a;链接 路面附着系数作为车辆底盘动力学反馈控制中的重要变量&#xff0c;对它的精确估计直接关系到控制系统的平稳运行和车辆行驶安全。但是由于无法通过直接测量获得某些状态参数或者测…

手册更新 | RK3588开发板适配Android13系统

iTOP-RK3588开发板使用手册更新&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 本次更新内容为《iTOP-3588开发板源码编译手册》&#xff0c;RK3588开发板适配了Android13系统&#xff0c;手册同步添加了And…

@所与人「要复现」文献调研与需求收集

鉴于上次的「下一个要知道什么」调查结果&#xff0c;我发现「复现文献」的呼声不是一般的高&#xff0c;那是相当的高呐&#xff01; 所以&#xff01;新的调查又来了&#xff01;文献数量和类型实在是太太太太太太庞大了&#xff01;所以我就想征询一下大家的需求&#xff0c…

新人必看,轻松学会品牌360百科词条创建

品牌在当今互联网时代的重要性不言而喻。随着人们对信息的需求和获取渠道的多样化&#xff0c;品牌需要在各个平台上展示自己的形象&#xff0c;其中包括360百科这样的综合性知识平台。创建360百科词条可以为品牌增加曝光度、提升信誉度&#xff0c;进而吸引更多潜在客户和粉丝…

机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用,结合生活中的生动例子帮助大家理解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下机器学习实战17-高斯朴素贝叶斯(GaussianNB)模型的实际应用&#xff0c;结合生活中的生动例子帮助大家理解。GaussianNB&#xff0c;即高斯朴素贝叶斯模型&#xff0c;是一种基于概率论的分类算法&#xff0c;广泛应…

HCIA复习

OSI --开放式系统互联参考模型 --- 7层参考模型 TCP/IP协议栈道 --- 4层或5层 OSI&#xff1a; 应用层 抽象语言 -->编码 表示层 编码-->二进制 表示层以下都是二进制-----data&#xff08;数据&#xff09; 会话层 提供应用程序的会话地址 上三层为应用…

刷题记录-leetcode字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat", &qu…

分享 5 个提高技术领导力的技巧

技术领导力于很多人而言都是谜一般的存在。有观点认为&#xff0c;实战经验丰富的资深开发最终只有成为技术管理者才能继续成长。从某些方面来看&#xff0c;这可能是对的&#xff0c;但考虑到公司结构和规章制度等&#xff0c;想要完成从「个人贡献者」到「技术管理者」的跨越…

Linux 查看磁盘信息:df与du命令详解

一、df 1.简介 df 是 disk free的缩写&#xff0c;从UNIX和类UNIX操作系统的早期开始&#xff0c;它就是UNIX和类UNIX操作系统的一部分。它被设计为一种工具&#xff0c;用于监视系统上已使用和可用的磁盘空间数量。 df 命令主要用于需要检查文件系统上已使用和可用的磁盘空…

【Servlet】生命周期

文章目录 一、生命周期二、错误实例三、修改Servlet的初始化时机 一、生命周期 生命周期&#xff1a;实例化、初始化、服务、销毁 从出生到死亡的过程。对应Servlet中的三个方法&#xff1a;init()&#xff0c;service()&#xff0c;destroy() 被创建&#xff1a;执行init方法…

磁性脂质体MLs纳米药物载体

磁性脂质体&#xff08;magnetoliposomes, MLs&#xff09;是一种结合了脂质体和磁性纳米颗粒&#xff08;MNPs&#xff09;的复合纳米结构&#xff0c;这种结构兼具了脂质体的生物相容性和磁性纳米颗粒的磁响应性&#xff0c;使其成为生物医学领域尤其是在药物递送系统中非常有…

算法学习——LeetCode力扣动态规划篇3(494. 目标和、474. 一和零、518. 零钱兑换 II)

算法学习——LeetCode力扣动态规划篇3 494. 目标和 494. 目标和 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 …

sk-learn 特征数据预处理方式汇总

数据集及基本操作 1&#xff09;数据集的组成 数据集由特征(feature)与标签(label)构成。 特征是输入数据。 什么是特征&#xff08;Features&#xff09;: 机器学习中输入数据&#xff0c;被称为特征。通常特征不止1个&#xff0c;可以用 n 维向量表示n个特征。 Features 数…