spring循环依赖 问题
2022-11-01 08:29:57 0 举报
spring循环依赖 问题,是如何解决的
作者其他创作
大纲/内容
key:bvalue:B@1935
成
key:avalue:lambda
创建A对象
三级缓存
doCreateBean
可以传递一个lambda表达式进来,在进行调用的时候 使用getObject来调用lambda表达式中的方法
找不到
map
描述A、B对象过程
没找到
key:avalue:A@1553
earlySingletonObjects(早期单例对象)2
Ba
singletonFactories(单例工厂)3函数式接口
反射的方式来进行实例化
doGetBean
调用init方法等相关操作
直接赋值
通过三级缓存来解决
初始化
获取对象的BeanDefinition
提前暴露对象
getBean
属性赋值两种办法
找到了
半成品A
为什么需要三级缓存?AOP为什么
半
半成品
填充B对象中的a属性
填充A对象的B属性
填充属性
singletonObjects(单例对象)1
实例化A对象b=null
createBean
属性赋值
成品
set
key:bvalue:lambda
三级缓存好像没有什么用处?1、 三级缓存中分别保存的是什么对象 1:成品对象 2:半成品对象 3:Lambda表达式2、如果只是用1级缓存行不行? 不行,因为产品和本成品对象会放到一起,在进行对象获取的时候有可能获取到半成品对象,这样的对象是无法使用的3、如果只有二级缓存行不行 getSingleton doCreateBean 只有二级缓存的时候 也可以解决循环依赖的问题 添加aop的实现之后,报错,this means that said other beans do not use the final version of the bean ,没有使用最终版本的bean对象4、三级缓存存在到底做了什么事? 如果一个对象需要被代理,生成代理对象,那么这个对象需要预先生成非代理对象吗? 需要 三级缓存到底做了什么? lambda:getEarlyBeanReference() 只要搞清楚这个方法的执行逻辑 在当前方法中,有可能用代理对象替换非代理对象,如果没有三级缓存的话,那么久无法的到代理对象,换句话说 在整个容器中,包含了同名对象的代理对象和 非代理对象,你觉得可以吗? 容器中,对象都是单例的,意味着根据名称只能获取一个对象的值,此时同时存在两个对象的话,使用的时候应该取哪一个?无法判断 谁也无法确认什么时候会调用当前对象,是在其他对象的执行过程中来进行调用的,而不是认为指定的,所以必须要保证容器中任何时候都只有一个对象供外部调用,所以在三级缓存中,完整了一件代理对象替代非代理对象的工作,确定返回的是唯一的对象。 三级缓存是为了解决在在aop代理过程中产生的循环问题,如果没有aop的话,二级缓存足以解决循环依赖问题。 其实相当于是一个回调机制,当我都需要使用当前对象的时候,会判断对象是否需要被代理实现,如果直接替换,不需要直接返回非代理对象即可5、spring是一个框架,跟业务完全无关,框架如何知道你什么时候用aop,什么时候不用aop呢? 但是在调用的时候,如果出现此问题怎么办呢?最重要的一件事,走总体的流程,如果有,就处理,没有就直接返回,不会有额外的任何影响。
从容器中查找B对象
Ab
半成品B
循环依赖问题是无法解决的
实例化B对象a=null
populateBean
在实例化的过程中,将处于半成品的对象全部都放到缓存中,方面后续来进行调用只要有了当前对象的引用地址,那么后续来进行赋值也可以半成品对象放到了map缓存结构中,成品对象要不要放到某个map中,能否把成品和半成品对象放到一起?如果放到一起,就会导致获取对象的时候获取到半成品对象,值为空为了将成品和半成品对象 完全区分开,那么可以创建两个缓存对象,可以有多级缓存一级缓存:成品对象 。 二级缓存:半成品对象 。 三级缓存:lambda表达式
从容器中查找A对象
构造器
三个Map结构
在spring中,对象bean默认都是单例的,意味着整个容器中只有一个对象,只要打破当前的闭环,循环依赖就不存在了
创建B对象
循环依赖
createBeanInstance
0 条评论
下一页