Spring循环依赖
2022-07-21 19:21:44 10 举报
spring循环依赖
作者其他创作
大纲/内容
循环依赖的解决方式
二级缓存
创建A对象
Spring获取Bean的重要方法
调用lambda表达式确定具体返回什么对象
成品
直接赋值即可
缓存
Spring 循环依赖
开始
populateBean
没有
三级缓存放b对象的lambda表达式因为a对象不知道何时被调用
判断容器中是否有B对象
创建B对象
完成实例化未完成初始化
一级缓存
Ba
循环依赖的产生
三级缓存放a对象的lambda表达式因为a对象不知道何时被调用
将对象按照状态区分
半成品
1.三个缓存结构map分别存储什么类型的对象? 一级缓存:成品对象。二级缓存:半成品对象。三级缓存:lambda表达式2.三个缓存结构map在进行对象查找的时候是什么顺序? 查找顺序:一级缓存、二级缓存、三级缓存3.如果只有一个map结构、能解决循环依赖问题吗? 理论上可行,实际上没人这么干,使用两个map的意义在于将成品对象和半成品对象进行区分。半成品对象是不能直接暴露给外部使用的。4.如果有两个map结构,能否解决循环依赖问题? 可以解决,但是有个前提,没有代理对象的时候,当不是用aop的时候,两个map可以解决循环依赖的问题。5.为什么使用三级缓存的时候可以解决带aop的循环依赖问题? 5.1 一个容器中,能同时包含两个同名的对象吗? 不能 5.2 对象的创建过程中,原始对象有没有可能需要生成代理对象? 有可能 5.3 如果创建除了代理对象,那么程序在调用的时候到底使用原始对象还是代理对象? 应该使用代理对象,但是程序是死的,是提前写好的?它怎么知道选择代理对象呢?所以当出现代理对象的时候需要使用代理对象替换掉原始对象 5.4 代理对象的创建是在初始化过程的扩展阶段,而属性的赋值是在生成代理对象之前执行的,那怎么进行替换呢?在属性赋值的时候判断是否需要生成代理对象。 5.5 那为什么要使用lambda表达式的机制来完成呢? 对象在什么时候被暴露出去或者被其他对象引用是没有办法提前确定好的,所以只有在被调用的那一刻才可以进行原始对象还是代理对象的判断,使用lambda 表达式类似于一种回调机制,不暴露的时候不需要执行,当需要被暴露的时候才真正执行lambda表达式。来判断到底返回的是原始对象还是代理对象。
createBean
实例B
有
使用三级缓存的意义
当持有某一个对象的引用后,能否在后续的步骤的时候给对象进行赋值操作?答:可以解决方式依据:实例化和初始化操作可以分开进行
createBeanInstance
进行A的实例化操作
给A对象的b属性赋值
给B对象赋值
getBean
doGetBean
三级级缓存
给B对象的a属性赋值
Ab
完成实例化和初始化
doCreateBean
进行B的实例化操作
判断需要赋值的是原始对象还是代理对象
给A对象赋值
判断容器中是否有A对象
三级缓存
实例A
0 条评论
下一页