04. Spring Framework 循环依赖
2022-02-26 09:50:25 0 举报
AI智能生成
Spring 循环依赖
作者其他创作
大纲/内容
getSingleton("dog", true)
此时获取不到返回 null
getSingleton("dog", () -> createBean("dog", mbd, args))
从二级缓存【earlySingletonObjects】移除
beforeSingletonCreation("dog")
添加到【singletonsCurrentlyInCreation】集合中表示正在创建
添加到【singletonsCurrentlyInCreation】集合中表示正在创建
singletonFactory.getObject()
通过上一步传入的匿名内部类创建 bean 对象
通过上一步传入的匿名内部类创建 bean 对象
createBean("dog", mbd, args)
创建 bean 对象
AbstractAutowireCapableBeanFactory.doCreateBean("dog")
真正的创建对象方法
createBeanInstance("dog", mbd, args)
使用构造方法创建 bean 实例
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
addSingletonFactory("dog", () -> getEarlyBeanReference("dog", mbd, bean))
向三级缓存 【singletonFactories】存一份 ObjectFactory(() -> getEarlyBeanReference("dog", mbd, bean))
从二级缓存 【earlySingletonObjects】移除
从二级缓存 【earlySingletonObjects】移除
populateBean("dog")
给 bean 属性赋值,依赖【person】,所以需要会从容器中查找 person 完成属性赋值
此方法执行完毕后【dog】对象所有属性会完成赋值操作
AbstractBeanFactory.doGetBean("person")
从容器中获取 people 对象
getSingleton("person", true)
此时获取不到返回 null
getSingleton("person", () -> createBean("person", mbd, args))
beforeSingletonCreation("person")
添加到【singletonsCurrentlyInCreation】集合中表示正在创建
添加到【singletonsCurrentlyInCreation】集合中表示正在创建
singletonFactory.getObject()
通过上一步传入的匿名内部类创建 bean 对象
通过上一步传入的匿名内部类创建 bean 对象
createBean("person", mbd, args)
创建 bean 对象
AbstractAutowireCapableBeanFactory.doCreateBean("person")
真正的创建对象方法
createBeanInstance("person", mbd, args)
使用构造方法创建 bean 实例
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
此时还未完成属性赋值、初始化方法等一系列操作,仅仅是通过反射实例化对象
addSingletonFactory("person", () -> getEarlyBeanReference("person", mbd, bean))
向三级缓存 【singletonFactories】存一份 ObjectFactory(() -> getEarlyBeanReference("person", mbd, bean))
从二级缓存 【earlySingletonObjects】移除
从二级缓存 【earlySingletonObjects】移除
populateBean("person")
给 bean 属性赋值,依赖【dog】,所以需要从容器中查找 dog 完成属性赋值
此方法执行完毕后【person】对象所有属性会完成赋值操作
AbstractBeanFactory.doGetBean("dog")
从容器中获取 dog 对象
getSingleton("dog", true)
这里会返回利用三级缓存创建的 bean 对象
getEarlyBeanReference("dog", mbd, bean)
此时 bean 对象是之前创建出来的状态(也有可能是 aop 代理对象,被 BeanPostProcessor 修改)
属性并未赋值,因为【populateBean】过程还未结束
属性并未赋值,因为【populateBean】过程还未结束
getEarlyBeanReference()
调用【SmartInstantiationAwareBeanPostProcessor】的 getEarlyBeanReference() 方法
校验是否能从二级缓存【earlySingletonObjects】中获取到之前提前暴露的 bean 对象
如果可以获取到,需要与赋值后的 bean 对象进行比较
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
如果可以获取到,需要与赋值后的 bean 对象进行比较
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
getSingleton("person", false)
此时获取不到返回 null
addSingleton("person", singletonObject)
从二级缓存【earlySingletonObjects】移除
向一级缓存【singletonFactories】添加 bean 对象
从三级缓存【singletonFactories】移除从二级缓存【earlySingletonObjects】移除
校验是否能从二级缓存【earlySingletonObjects】中获取到之前提前暴露的 bean 对象
如果可以获取到,需要与赋值后的 bean 对象进行比较
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
如果可以获取到,需要与赋值后的 bean 对象进行比较
如果不是同一个对象则表明被 AOP 进行代理了这里就会抛出异常
getSingleton("person", false)
返回从二级缓存 【earlySingletonObjects】 获取到的 bean 对象
addSingleton("dog", singletonObject)
向一级缓存【singletonFactories】添加 bean 对象
从三级缓存【singletonFactories】移除向一级缓存【singletonFactories】添加 bean 对象
从二级缓存【earlySingletonObjects】移除
0 条评论
下一页