Python 官方文档:入门教程 => 点击学习
spring如何使用三级缓存解决循环依赖在没开始文章之前首先来了解一下什么是循环依赖 @Component public class A { @Autowired
spring如何使用三级缓存解决循环依赖在没开始文章之前首先来了解一下什么是循环依赖
@Component
public class A {
@Autowired
B b;
}
@Component
public class B {
@Autowired
A a;
}
在对象A创建过程中,需要注入B,因为容器中没有B,则去创建B,B创建过程中又需要注入A,而A在等待B的创建,B在等待A的创建,导致两者都无法创建成功,无法加入到单例池供用户使用。
Spring则通过三级缓存来解决循环依赖的问题,另外如果对象的作用范围是Prototype,则无法通过三级缓存解决循环依赖,会抛出BeanCurrentlyInCreationException
异常,构造注入的方式,也无法解决循环依赖,只有set注入可以解决。
那么三级缓存又是什么呢?
三级缓存就是三个Map
public class DefaultSingletonBeanReGIStry extends SimpleAliasRegistry implements SingletonBeanRegistry {
//一级缓存(单例池,经过完成生命周期的对象会放入其中)
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
//二级缓存(刚实例化还未初始化的原始对象会放入其中)
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
//三级缓存(存放创建某个对象的工厂)
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
Spring Bean对象从创建到初始化大致会经过四个流程
getSingleton()
、doCreateBean()
、populateBean()
、addSingleton()
getSingleton
:从单例池中获取bean对象,如果没有,则进行创建doCreateBean()
:创建bean对象populateBean()
:填充依赖,如果被填充的对象不存在于单例池,则进行创建等四个流程addSingleton()
:将初始化完成的对象加入到单例池循环依赖的对象在三级缓存中的迁移过程
然后接着回来创建 A,此时 B 已经完成创建,直接从一级缓存中拿到 B,完成 A 的创建,并将 A 添加到单例池,删除二级缓存中的 A
图示:
以上就是Spring使用三级缓存解决循环依赖的详细内容,更多关于Spring循环依赖的资料请关注编程网其它相关文章!
--结束END--
本文标题: Spring使用三级缓存解决循环依赖的问题
本文链接: https://www.lsjlt.com/news/128068.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0