前提知识

1、解决循环依赖的核心依据:实例化和初始化步骤是分开执行的

2、实现方式:三级缓存

3、lambda表达式的延迟执行特性

spring源码执行逻辑

核心方法refresh(), populateBean()填充bean对象,设置属性值;

getEarlyBeanReference() 在未完成属性赋值之前,提前暴露代理对象,在赋值的时候才确定真实对象。

1、三个map结构分别存储什么类型的对象?

-级缓存:成品对象

级缓存:半成品对象

三级缓存:lambda表达式

2、三个map结构在进行对象查找的时候,查找的顺序是什么样的?

1, 2, 3

3、为什么一级缓存有对象之后就要把二级和三级给移除掉?

因为对象的查找顺序是1,2,3,如果在一级中找到了,那么二级永远也不会进行查找,以此类推

4、如果只有一个map结构,能否解决循环依赖问题?

原则上是可以的,但是操作起来比较麻烦,当只有一个map结构的时候就意味着成品对象和半成品对象要放到一起,而半成品对象是不能暴露给外部使用的,要不会报空指针异常,所以需要添加标识位,而容器中对象的名字都是固定的,所以标识位只能在value中,也就意味着每次在判断的时候都要获取到value然后判断完标志位之后才能进行下一步操作,比较麻烦,直接用两个map可以轻松解决这个问题

5、如果只有两个map结构,能否解决循环依赖问题?

原则上是可以的,但是有前提条件:整个代码的执行逻辑中不能包含代理对象的创建,否则会报错

6、为什么必须要使用三个map结构来解决循环依赖问题?三级缓存是如何解决循环依赖问题的?

(1)在创建代理对象的时候是否需要创建原始对象?

需要

(2)容器中能否同时存在两个同名的不同对象?

不能

(3)如果创建出了代理对象,那么原始对象应该怎么处理?

当创建出代理对象之后,需要将代理对象覆盖原始对象

(4)那么为什么要引入三级缓存呢?为什么要传入一个lambda表达式呢?

正常的bean的生命周期是先通过createBeanlnstance创建出原始对象,然后在populateBean的方法中完成对象属性的赋值工作,然后在BeanPostProcessor的后置处理方法中完成代理对象的创建工作,也就是说按照正常的执行逻辑,是完成属性的赋值之后才会创建出代理对象,那么意味着最后创建出的是代理对象,但是赋值的时候赋的是原始对象,所以会出现一个错误:that said other beans do not use the final version of the bean. 当引入lambda表达式之后相当于将生成代理对象的过程给提前了,也就是说在完成对象的属性赋值的时候必须要唯一性的确定好我需要的到底是代理对象还是原始对象,参考 (getEarlyBeanReference方法)也就是说我们在赋值的前一刻必须要确定好最终的结果,但是又因为我们没有办法确定什么时刻会给什么对象的属性赋值,所以采用lambda表达式的方法延迟执行,只有在对象赋值的最后一刻才确定出到底是什么对象。

Spring三级缓存解决循环依赖的更多相关文章

  1. Spring如何使用三级缓存解决循环依赖

    Spring如何使用三级缓存解决循环依赖 首先来了解一下什么是循环依赖 @Component public class A { @Autowired B b; } @Component public ...

  2. Spring是如何解决循环依赖的

    前言 在面试的时候这两年有一个非常高频的关于spring的问题,那就是spring是如何解决循环依赖的.这个问题听着就是轻描淡写的一句话,其实考察的内容还是非常多的,主要还是考察的应聘者有没有研究过s ...

  3. spring: 我是如何解决循环依赖的?

    1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到.平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的 ...

  4. Spring 是如何解决循环依赖的?

    前言 相信很多小伙伴在工作中都会遇到循环依赖,不过大多数它是这样显示的: 还会提示这么一句: Requested bean is currently in creation: Is there an ...

  5. 听说你还不知道Spring是如何解决循环依赖问题的?

    Spring如何解决的循环依赖,是近两年流行起来的一道Java面试题. 其实笔者本人对这类框架源码题还是持一定的怀疑态度的. 如果笔者作为面试官,可能会问一些诸如"如果注入的属性为null, ...

  6. Spring 动态代理时是如何解决循环依赖的?为什么要使用三级缓存?

    前言 在研究 『 Spring 是如何解决循环依赖的 』 的时候,了解到 Spring 是借助三级缓存来解决循环依赖的. 同样在上一节留下了疑问: 循环依赖为什么要使用三级缓存?而不是使用二级缓存? ...

  7. Spring ioc(4)---如何解决循环依赖

    前面说到对象的创建,那么在创建的过程中Spring是怎么又是如何解决循环依赖的呢.前面提到有个三级缓存.就是利用这个来解决循环依赖.打个比方说实例化A的时候,先将A创建(早期对象)放入一个池子中.这个 ...

  8. Spring解决循环依赖,你真的懂了吗?

    导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...

  9. Spring如何解决循环依赖,你真的懂了?

    导读 前几天发表的文章SpringBoot多数据源动态切换和SpringBoot整合多数据源的巨坑中,提到了一个坑就是动态数据源添加@Primary接口就会造成循环依赖异常,如下图: 这个就是典型的构 ...

随机推荐

  1. scratch制作彩虹猫病毒模拟器

    scratch制作彩虹猫病毒模拟器 hello,大家好. 编程慢慢更加接近生活,甚至小孩也开始学了,比如scratch编程,小编今天就带了一件作品(彩虹猫病毒模拟器) 我们先看一下效果| 做的还可以, ...

  2. 一些有用的数学知识(Updating)

    文章目录 拉格朗日插值公式 微分中值定理 费马引理 拉格朗日中值定理 柯西中值定理 洛必达法则 连分数(NOI2021 D2T2 考点) 定义 结论 定理1 定理2 定理3 定理4 定理5 欧拉公式 ...

  3. HDU6848改编题(弱化)——客星璀璨之夜(stars)

    「 客星璀璨之夜 」(stars) " 虽然不清楚是不是那两人的力量 在那个风暴肆虐的夜晚,的确有一瞬 真的在那一瞬间,在云破天开的时候 透过空隙中看到的璀璨星空,不知为何倒映眼中不能忘怀 ...

  4. vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为

    vue-router4 出现 No match found for location with path "/" #### router/index.ts文件 import { c ...

  5. Html飞机大战(五):主角登场(英雄类编辑)

    好家伙, 遇到了一些非常奇怪的bug index.html:179 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRender ...

  6. 第九章 kubectl命令行工具使用详解

    1.管理k8s核心资源的三种基础方法 陈述式管理方法:主要依赖命令行CLI工具进行管理 声明式管理方法:主要依赖统一资源配置清单(manifest)进行管理 GUI式管理方法:主要依赖图形化操作界面( ...

  7. vCenter 升级错误 VCSServiceManager 1603

    近日,看到了VMware发布的vCenter 6.7 Update 1b的更新消息.其中有一条比较震撼.有误删所有VM的概率,这种BUG谁也承受不起. Removing a virtual machi ...

  8. 从零打造“乞丐版” React(一)——从命令式编程到声明式编程

    这个系列的目的是通过使用 JS 实现"乞丐版"的 React,让读者了解 React 的基本工作原理,体会 React 带来的构建应用的优势 1 HTML 构建静态页面 使用 HT ...

  9. (四)JPA - JQPL 实现增删改查

    (一)JPA的快速入门 建议在需要使用时,看看之前的文章,先把环境搭起来. 5.JPQL JPQL和SQL 1.JPQL和SQL很像,查询关键字都是一样的 2.唯一的区别是:JPQL是面向对象的 JP ...

  10. 组件化开发2-安装cocoaPods

    第一步:安装ruby 不能一上来就换ruby源.虽然mac自带了ruby,但是版本一般都偏低,如果不进行更新会导致版本依赖问题. 这里使用rvm来管理ruby,它允许共存多个ruby.RVM:Ruby ...