循环依赖
2021-05-05 14:59:56 3 举报
spring 循环依赖理解
作者其他创作
大纲/内容
实例B
一级缓存
earlySingletonExposure=true去缓存中获取实例a1、一级缓存中获取不到实例a2、二级缓存中可以获取到,并进行相关处理
实例A属性填充
去缓存中获取1、此时一级缓存中获取不到实例A,实例A创建中2、此时二级缓存中也获取不到实例A,allowEarlyReference=true3、获取三级缓存中A的值,即之前放入到里面的匿名内部类,调用匿名内部类获取对应实例4、获取到实例化,将实例放入到二级缓存中,并将三级缓存中的对象移除(此时获取到的对象是之前实例化完成并未初始化的实例A)(在根据匿名内部类获取实例A时,根据A是否需要代理,返回相应的实例)
实例B属性填充
实例B实例化完成后,将实例B当做ObjectFactory-匿名内部类的方法参数(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference),将该匿名内部类放入到三级缓存中
1、将实例B放入到一级缓存中2、从二、三级缓存中移除实例B对应的值
解析到A的实例中需要实例B,进行实例B的创建
实例A实例化完成后,将实例A当做参数放入到ObjectFactory-匿名内部类的方法中(org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#getEarlyBeanReference),并将该匿名内部类放入到三级缓存中
b:getEarlyBeanReference - 2
创建实例B
a:实例化并且初始化完成的实例a - 5
a:getEarlyBeanReference - 1
开始创建实例
1、将实例化完成的实例A以参数的形式放入到匿名内部类ObjectFactory中,将匿名内部类放入三级缓存中2、进行实例A的属性实例B的填充3、将实例化完成的实例B以参数的形式放入到匿名内部类ObjectFactory中,将匿名内部类放入到三级缓存中4、进行实例B的属性实例A的填充5、缓存中获取实例A、从三级缓存中获取到之前的匿名内部类,通过匿名内部类获取到实例化完成未初始化的实例A6、将实例A在三级缓存中的实例移除,放入到二级缓存中7、将实例A放入到实例B的属性a中,实例B完成实例化以及初始化,将实例B从二、三级缓存中移除,并放入以及缓存8、将获取到的已经实例化、初始化完成的实例B放入到实例A的属性b中9、将实例A放入到一级缓存中,将二、三级缓存中的对象移除
将获取到的实例B放入到实例A的属性中属性填充结束
将处理好的实例A放入到一级缓存中,并将二、三级缓存中的进行移除
二级缓存
假设先创建实例A
b:实例化并且初始化完成的实例B - 4
将获取到的实例A放入到实例B的属性a中属性填充结束
去一级缓存中获取实例A,获取不到并且不是创建中,直接返回空
a:实例化完成为初始化实例 - 3
去一级缓存中获取实例B,获取不到并且不是创建中,直接返回空
解析到实例B中需要实例A,进行实例A的获取
三级缓存
实例A
创建要获取的实例A
@Componentpublic class A { @Autowired B b;}@Componentpublic class B { @Autowired private A a;}
0 条评论
下一页