Spring循环依赖
2022-04-13 22:21:48 0 举报
Spring循环依赖
作者其他创作
大纲/内容
正常bean创建动态代理
Bean A
假如A使用了AOP,那么存在一级缓存中也要是动态代理。但是循环依赖中一级创建过了一次动态代理,并且放在了二级缓存中,所以这里不必要再次创建一次,直接从二级缓存中拿
@AutowiredA a
属性填充解析@Autowired
retrun 二级缓存
getBean()
只用二级缓存完全可以解决循环依赖只用二级缓存解决循环依赖问题:1.耦合 2.多线程读取性能问题
@AutowiredB b
实例化后就放入一级缓存
createBeanInstance
@Componentpublic class BeanA { private String name; @Autowired private BeanB beanB;}
一级缓存
B纯净
三级缓存
getBean(beanName)
有
实例化
初始化
return
ObjectFactory
Aproxy
三级缓存利用函数接口,将createBean和getBean的逻辑解耦因为二级缓存也能解决循环依赖,但是需要创建bean的相关逻辑在getsingleton中
@Componentpublic class BeanC { private String name; @Autowired private BeanA beanA;}
循环依赖的出现
retrun bean
populateBean
Bean B
C依赖A
beanName
A依赖B
getSingleton
不管是不是循环依赖,都会在这里创建动态代理
第一次调用返回null
B依赖C
没有
A成熟
二级缓存
@Componentpublic class BeanB { private String name; @Autowired private BeanA beanA;}
二级缓存是否有
createBean
doGetBean
一级缓存是否有
No
doCreateBean
B依赖A
return
A纯净
用一级缓存解决循环依赖问题:无法保证多线程下的一级缓存bean的完整性,有可能还没有进行属性赋值,纯静态的bean
@Componentpublic class BeanB { private String name; @Autowired private BeanC beanC;}
创建动态代理对象
initializeBean
循环依赖
出口getSingleton
使用三级缓存解决循环依赖才比较完美
0 条评论
下一页