循环依赖和三级缓存

循环依赖:

        是指一个或多个Bean实例之间存在直接或简介的依赖关系,这种依赖关系构成了环形调用(类与类之间的依赖关系形成了闭环)。

循环依赖的表现形式

 eg1:

        自己依赖自己的直接依赖

       

eg2:

        两个对象之间的直接依赖

eg3:

        多个对象之间的间接依赖

Spirng 框架提供的解决方案:

三级缓存:

                三级缓存,就是用来存放不同类型的Bean

                第一级缓存:用于存放完全初始化的Bean,该Bean可以直接被使用
                第二级缓存:存放原始的Bean的对象,这个Bean里面的属性还没有被赋值,或者没有被依赖注入。

                第三级缓存:存放的是一个Bean工厂对象,用来生成原始的Bean对象,并且放入到耳机缓存中去。

举例:

BeanA 和 BeanB之间存在循环依赖,三级缓存的解决方式

                                             

步骤: 1实例化Bean A,然后把Bean A 包装成一个ObjectFactory对象,保存到三级缓存中去

             2Bean A 开始对Bean A 的成员属性 Bena B开始依赖注入,于是开始了Bean B的初始化,在Bean B初始化时,Bean B会从三级缓存中找到 Bean A,完成 Bean B 自身需求的BeanA的依赖注入,Bean B 初始化成功后就会保存到一级缓存中去。

             3 在Bean B 放入到一级缓存中去后,Bean A 就可以从一级缓存中拿到Bean B 的实例,从而去完成正常的依赖注入。

            核心思想:   

        将Bean的实例化和Bean的属性依赖注入,这两个过程分离开 

Spring 如何解决循环依赖:

        Spring设计了三级缓存来解决循环依赖,一级缓存里面存储完整的Bean实例对象,这些实例时可以被直接使用的。第二级缓存里存储这完成实例化后,但是还没有设置属性值的Bean实例,就是指Bean里面的依赖注入还没有完成。第三级缓存用来存放Bean工厂,它主要用来生产原始的Bean对象,并且放到第二级缓存中去。三级缓存的核心思想就是:"把Bean的实例化和Bean里面的依赖注入进行分离,采用一级缓存存储完整的Bean实例,采用二级缓存存储不完整的Bean实例,通过不完整的实例作为突破口,解决循环依赖的问题。第三级别缓存,主要解决代理对象的循环依赖问题。

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

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

相关文章

Notepad++运行C语言输出乱码

方法一:编码-编码字符集-中文-GB2312 这时原程序中文会变成乱码,我是重新输入中文 重新编译执行即可 缺陷:重开一个程序有中文还是会显示乱码,需要重新设置编码,比较麻烦 方法二:设置-首选项-新建-右侧编…

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目,输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码,完成。 操作Comm…

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

5D动感影院新奇体验丰富环境特效7D互动影院

5D动感影院太火啦!凭借真实互动感、全视景高清屏幕、立体环绕音效、D打造新颖沉浸式观影体验,成为年轻人/家长/小朋友的新晋打卡聚集地,时刻上演着精彩绝伦的视觉盛宴! 1、5D动感影院【硬件组成】:动感平台、金属银幕、…

【LabVIEW FPGA入门】FPGA中的数学运算

数值控件选板上的大部分数学函数都支持整数或定点数据类型,但是需要请注意,避免使用乘法、除法、倒数、平方根等函数,此类函数比较占用FPGA资源,且如果使用的是定点数据或单精度浮点数据仅适用于FPGA终端。 1.整数运算 支持的数…

设计模式—— 单例设计模式

单例设计模式 什么是单例模式 单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。 为什么使用单例模式 在应用系统开发中,我…

指向未来: 量子纠缠的本质是一个指针

指向未来: 量子纠缠的本质是一个指针 概述基本概念理解量子纠缠PythonJavaC 理解波粒二象性PythonJavaC 理解量子隧穿理解宇宙常量PythonJavaC 概述 量子纠缠 (Quantum Entanglement) 是量子系统重两个或多个粒子间的一种特殊连接, 这种连接使得即使相隔很远, 这些粒子的状态也…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

4D毫米波雷达——原理、对比、优势、行业现状

前言 4D 毫米波雷达是传统毫米波雷达的升级版,4D指的是速度、距离、水平角度、垂直高度四个维度。 相比传统 3D 毫米波雷达,4D 毫米波雷达增加了“高度”的探测,将第四个维度整合到传统毫米波雷达中。 4D毫米波雷达被视为未来车载雷达的一…

Redis 笔记一

概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习:Redis 教程 | 菜鸟教程 1.Redis为什…

macOS系统下载安装IDEA 操作流程

目录 第一步 进入官网,选择箭头指向的版本 第二步 下载完成后打开,拖动安装包安装​编辑 第三步 点击" project",在JDK下拉框选择"Download JDK" 第四步 下载完成以后,点击右下角的Create按钮。 第一步 进…

2.mac 安装 Visual studio code 整合go开发

目录 概述前置下载关键命令整合C#go配置go插件常见的go工具安装测试 结束 概述 mac 安装 Visual studio code 整合go开发 相关前置文章 go安装及相关配置 文章 前置 官网速递 mac 系统高于等于 10.15.x 可以直接最新版本 我的系统是 10.13 ,所以只能安装此版本…