spring循环依赖过程
循环依赖过程
A->B B->A
1、doGetBean->getSingleton(A)先从一级缓存单例缓存singletonObjects获取,这个时候为空,
再判断singletonObject == null && isSingletonCurrentlyInCreation(beanName)也不是正在创建单例,故而不能从二级缓存earlySingletonObjects获取
2、第二个获取单例getSingleton(A,createBean(beanName, mbd, args)),beforeSingletonCreation(beanName)把A放入singletonsCurrentlyInCreation缓存中
3、再执行createBean->doCreateBean->createBeanInstance(beanName, mbd, args)
先创建对象beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this)实例化对象执行构造函数
4、实例化对象后doCreateBean——>addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)),把A加入singletonFactories三级缓存中
5、然后doCreateBean -> populateBean(beanName, mbd, instanceWrapper)开始填充对象,这个时候发现有注入了B,然后要先实例化B,开始执行getBean
6、B重复动作1、2、3、发现要注入A,然后A再执行动作1,getSingleton(A)->singletonsCurrentlyInCreation有值然后把A放入二级缓存earlySingletonObjects中,
再把A从singletonFactories三级缓存删除。
7、A此时完成二级缓存earlySingletonObjects中半成本,返回给B,populateBean填充完属性,执行initializeBean初始化对象B,
执行applyBeanPostProcessorsBeforeInitialization(),invokeInitMethods(),applyBeanPostProcessorsAfterInitialization()三部曲,然后完成B的初始化
最后addSingleton()把B加入singletonObjects单例池中,把B从二级缓存earlySingletonObjects删除
8、然后主程序回到A执行的5中,完成了B的填充,A执行initializeBean初始化对象,
执行applyBeanPostProcessorsBeforeInitialization(),invokeInitMethods(),applyBeanPostProcessorsAfterInitialization()三部曲,然后完成B的初始化
最后addSingleton()把A加入singletonObjects单例池中,把A从二级缓存earlySingletonObjects删除
总结:
A->B B->A 过程是: A实例化->B实例化->B初始化->A初始化
1、一级缓存singletonObjects单例池,对象完成初始化时放入
2、二级缓存earlySingletonObjects半成品,提前暴露对象
3、三级缓存singletonFactories,解决循环依赖主要作用
实例化A -> A加入singletonFactories三级缓存中 -> 填充A,发现要注入B ->
实例化B -> B加入singletonFactories三级缓存中 -> 填充B,发现要注入A -> 创建中A加入earlySingletonObjects二级缓存,删除singletonFactories,返回半成品 ->
B拿到A半成品,initializeBean初始化对象 -> B初始化完成 -> B放入singletonObjects单例池,删除earlySingletonObjects
A拿到实例化的B,initializeBean初始化对象 -> A初始化完成 -> A放入singletonObjects单例池,删除earlySingletonObjects
在这个过程中发现B并没有生成earlySingletonObjects二级缓存,主要作用还是singletonFactories三级缓存。
@PostConstruct 、implements InitializingBean、xml配置init-mthon方法,执行顺序是@PostConstruct、InitializingBean、xml 取决代码执行initializeBean初始化对象,
执行applyBeanPostProcessorsBeforeInitialization(),invokeInitMethods(),applyBeanPostProcessorsAfterInitialization()三部曲
spring循环依赖过程的更多相关文章
- 3.3 Spring5源码---循环依赖过程中spring读取不完整bean的最终解决方案
根据之前解析的循环依赖的源码, 分析了一级缓存,二级缓存,三级缓存的作用以及如何解决循环依赖的. 然而在多线程的情况下, Spring在创建bean的过程中, 可能会读取到不完整的bean. 下面, ...
- Spring 循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...
- Springboot源码分析之Spring循环依赖揭秘
摘要: 若你是一个有经验的程序员,那你在开发中必然碰到过这种现象:事务不生效.或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖问题吗,它是怎么又会发生循环依赖的呢?,接下来就让我 ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
- Spring循环依赖的解决
## Spring循环依赖的解决 ### 什么是循环依赖 循环依赖,是依赖关系形成了一个圆环.比如:A对象有一个属性B,那么这时候我们称之为A依赖B,如果这时候B对象里面有一个属性A.那么这时候A和B ...
- 这个 Spring 循环依赖的坑,90% 以上的人都不知道
1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题.这里权且称他非典型Spring ...
- Spring — 循环依赖
读完这篇文章你将会收获到 Spring 循环依赖可以分为哪两种 Spring 如何解决 setter 循环依赖 Spring 为何是三级缓存 , 二级不行 ? Spring 为啥不能解决构造器循环依赖 ...
- spring 循环依赖的一次 理解
前言: 在看spring 循环依赖的问题中,知道原理,网上一堆的资料有讲原理. 但今天在看代码过程中,又产生了疑问. 疑问点如下: // 疑问点: 先进行 dependon 判断String[] de ...
- 3.1 spring5源码系列--循环依赖 之 手写代码模拟spring循环依赖
本次博客的目标 1. 手写spring循环依赖的整个过程 2. spring怎么解决循环依赖 3. 为什么要二级缓存和三级缓存 4. spring有没有解决构造函数的循环依赖 5. spring有没有 ...
- Spring循环依赖原理
Spring循环依赖的原理解析 1.什么是循环依赖? 我们使用Spring的时候,在一个对象中注入另一个对象,但是另外的一个对象中也包含该对象.如图: 在Student中包含了teacher的一个 ...
随机推荐
- windows应用程序icon缓存、查看图标、icon制作方法
windows程序图标缓存 在vs中替换c++程序的图标后,需要重新编译,但是很多情况下都不会刷新,还是看到老的图标,只能重启电脑才能看到新的图标. 通过ChatGPT得到相关的回答如下: 如果在 W ...
- fbx查看软件
对于3D的模型资源,比如fbx文件,除了使用专业的软件查看外,比如Unity3D,vs2015及更高版本,maya,3DMax等等,有没有更加轻量的软件可以查看fbx的内容呢? win10自带 win ...
- 【二】tensorflow调试报错、TF深度学习强化学习教学
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- 从嘉手札<2023-10-25>
晨辉明灭 启明星低垂的挂在天边 烟霞浅浅的铺满了东方的天幕 赤红中张扬着睥睨的紫光 可惜 不过又是无趣的一天 我百无聊赖的抬起头 从缝隙里看向窗外的天空的一角 只是觉得无趣 一天天的日子如流水般远去 ...
- Arduino-电位器调节led
Arduino-电位器调节led 电位器相关: 电位器是具有三个引出端.阻值可按某种变化规律调节的电阻元件.电位器通常由电阻体和可移动的电刷组成.当电刷沿电阻体移动时,在输出端即获得与位移量成一定关系 ...
- yapi 的分组的理解!
yapi ,分为超级管理员和 分组组长和项目组长: ------------------------------------------------------------------------ 人 ...
- TPopupMenu 替换 自身自动的 热键
有时候自动生成的热键 并不是 很理想 这个时候 需要 用自己认为好的 方法如下图,加个(&热键)
- JS模块化系统
随着 JavaScript 开发变得越来越广泛,命名空间和依赖关系变得越来越难以处理.人们已经开发出不同的解决方案以模块系统的形式来解决这个问题. CommonJS(CJS) CommonJS 是一种 ...
- NC51179 选课
题目链接 题目 题目描述 学校实行学分制. 每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分. 学校开设了 N 门的选修课程,每个学生可选课程的数量 M 是给定的. 学生选修了这 M 门课 ...
- Freaktab将于12月底关闭
出过众多优秀固件的电视盒子论坛Freaktab, 将于2021年12月31日关闭 R.I.P