Spring循环依赖问题的解决
循环依赖问题
一个bean的创建分为如下步骤:
当创建一个简单对象的时候,过程如下:
- 先从单例池中获取bean,发现无 a
- 创建 a 的实例
- 为 a 赋值
- 把 a 放到单例池中
当创建一个对象并且其中有另外一个对象是就变成了这样:
但是当在B对象中由引用了A对象,就会变成这样:
因为A和B两者相互引用,但是单例池中始终无法创建任一对象,所以会出现死循环。
因此,我们需要添加一个半成品池,先把A初始化出来,放到一个半成品池中。
过程如下:
- 先从单例池中找A对象,没有则开始创建A对象
- 实例化A对象,并放入半成品池中
- 为A对象赋值
- 赋值时发现引用了B对象 --> 实例化B对象,并放入半成品池中
- 为B对象赋值
- 赋值时发现引用了A对象,从单例池中和半成品池中找A对象,并将其赋值
- 实例化B对象,并放入单例池中
- 实例化A对象,从半成品池中移除A对象,并放入单例池中
这样就解决了死循环创建但是当使用了动态代理后,情况又会有所变化.
先来看一下AOP的执行过程,如图:
在bean的创建过程中,创建动态代理的时机是在初始化之后的,如图:
这个时候半成品池里放的是没有代理过的A对象,当B去半成品池中获取A对象,获取的是动态代理前的A对象,而我们应该获取的是动态代理后的A对象,这就会出现问题.
为了解决AOP的问题,spring又加入了一个工厂池
执行过程如下:
- 当创建A对象的时候会在工厂池中创建factory(a)
- ....
- 当给B赋值时,发现引用了A,就会去工厂池中执行
getEarlyReference 提前处理
方法,生成一个动态代理后的A对象,并放入半成品池中,再赋值给B - ...
注意:
当实例化对象A的时候,A对象会产生与之对应的factory(a)方法,只有当某个对象引用A对象时,factory(a)方法才会被执行,从而去通过提前引用的方式创建动态代理对象放入半成品池中
如果说A对象没有被提前引用,factory(a)方法不会执行
Spring循环依赖问题的解决的更多相关文章
- spring循环依赖是怎么解决的?
回答:循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleA,则它们最终反映为一个环. Spring如何解决循环依赖? ...
- Spring循环依赖的三种方式以及解决办法
一. 什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环.比如A依赖于B,B依赖于C,C又依赖于A.如下图: 注意,这里不是函数的循环调用,是对象的 ...
- Spring 循环依赖的三种方式(三级缓存解决Set循环依赖问题)
本篇文章解决以下问题: [1] . Spring循环依赖指的是什么? [2] . Spring能解决哪种情况的循环依赖?不能解决哪种情况? [3] . Spring能解决的循环依赖原理(三级缓存) 一 ...
- Spring循环依赖的解决
## Spring循环依赖的解决 ### 什么是循环依赖 循环依赖,是依赖关系形成了一个圆环.比如:A对象有一个属性B,那么这时候我们称之为A依赖B,如果这时候B对象里面有一个属性A.那么这时候A和B ...
- Spring循环依赖问题
什么是循环依赖? 循环依赖就是循环引用,指两个或多个bean互相持有对方,比如说TestA引用TestB.TestB引用TestA,最终形成一个闭环. 注意:循环依赖不是指循环调用. 循环调用:指方法 ...
- Spring循环依赖
Spring-bean的循环依赖以及解决方式 Spring里面Bean的生命周期和循环依赖问题 什么是循环依赖? 循环依赖其实就是循环引用,也就是两个或者两个以上的bean互相持有对方,最终形成闭环. ...
- Spring 循环依赖
循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA,则它们最终反映为一个环.此处不 ...
- Springboot源码分析之Spring循环依赖揭秘
摘要: 若你是一个有经验的程序员,那你在开发中必然碰到过这种现象:事务不生效.或许刚说到这,有的小伙伴就会大惊失色了.Spring不是解决了循环依赖问题吗,它是怎么又会发生循环依赖的呢?,接下来就让我 ...
- 这个 Spring 循环依赖的坑,90% 以上的人都不知道
1. 前言 这两天工作遇到了一个挺有意思的Spring循环依赖的问题,但是这个和以往遇到的循环依赖问题都不太一样,隐藏的相当隐蔽,网络上也很少看到有其他人遇到类似的问题.这里权且称他非典型Spring ...
随机推荐
- Scientific Internet Access
下载小飞机 https://github.com/shadowsocksr-backup 寻找ssr https://github.com/Alvin9999/new-pac/wiki/ss%E5%8 ...
- 为什么要放弃 JSP?他们终于给出了答案
前言 以前的项目大多数都是Java程序猿又当爹又当妈,既搞前,又搞后端. 随着时代的发展,渐渐的许多大中小公司开始把前后端的界限分的越来越明确,前端工程师只负责前端的事情,后端工程师只管后端的事情.正 ...
- 创建第一个HTML文件
首先右键新建文本文档,然后打开新建的文档,文本内容写上: <html> <head> <title>我的HTML标题</title> </head ...
- MyBatis笔记(三)
1. ResultMap 查询结果为null:要解决属性和字段名不一致的问题 我们先来看下步骤: 数据库中的字段名 Java中的实体类 public class User { private i ...
- Horovod Install
Horovod documentation 安装 [Step1]安装Open MPI 注意: Open MPI 3.1.3 安装有些问题, 可以安装 Open MPI 3.1.2 或者 Open MP ...
- 网络编程Netty入门:Netty简介及其特性
目录 Netty的简介 Netty的特性 Netty的整体结构 Netty的核心组件 Netty的线程模型 结束语 Netty的简介 Netty是一个java开源框架,是基于NIO的高性能.高可扩展性 ...
- 2021S软件工程——结对项目第三阶段
2021S软件工程--结对项目第三阶段 2021春季软件工程(罗杰 任健) 项目地址 1020 1169 1 实践反思 1.1 问题分析 两人习惯不一致 没有具体制定时间节点 写完代码才开始" ...
- 一文抽丝剥茧带你掌握复杂Gremlin查询的调试方法
摘要:Gremlin是图数据库查询使用最普遍的基础查询语言.Gremlin的图灵完备性,使其能够编写非常复杂的查询语句.对于复杂的问题,我们该如何编写一个复杂的查询?以及我们该如何理解已有的复杂查询? ...
- 02- Python的版本
python的官网 https://www.python.org/ Python的版本 python v2.7(2020结束维护) python v.3.5(当前使用的版本) python v3 ...
- 转载:Windows使用tail -f 监控文件
https://www.cnblogs.com/my-bambi/p/11793770.html