标签:业务开发 业务 head www 对象 描述 构造器 有关 exception
// 业务开发中经常这么写,field注入、setter注入都OK,但是构造器注入会报错BeanCurrentlyInCreationException
// 有这种循环依赖问题存在Spring却依然能够正常启动工作,为什么?Spring帮我们搞定了:三级缓存
@Service
public class AServiceImpl implements AService {
@Autowired
private BService bService;
}
@Service
public class BServiceImpl implements BService {
@Autowired
private AService aService;
}
在创建过程中,都是从三级缓存(对象工厂创建不完整对象),将提前暴露的对象放入到二级缓存,从二级缓存拿到后,完成初始化,放入一级缓存。
名称 描述 singletonObjects 一级缓存,存放完整的 Bean。 earlySingletonObjects 二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行 init 方法。 singletonFactories 三级缓存,存放的是 Bean 工厂,主要是生产 Bean,存放到二级缓存中。
A的某个field或者setter依赖了B的实例对象,同时B的某个field或者setter依赖了A的实例对象”这种循环依赖的情景。
一定需要三级缓存吗?
? 和AOP有关,第三级缓存的目的是为了延迟代理对象的创建(以应对循环依赖问题)。如果可以在实例化完成后立即创建代理对象,就不需要三级缓存了,所以二级缓存也是可以解决循环依赖的。为啥要额外多添加一层缓存?因为 Spring 的设计原则是在 Bean 初始化完成之后才为其创建代理
标签:业务开发 业务 head www 对象 描述 构造器 有关 exception
原文地址:https://www.cnblogs.com/brightdagger/p/14687489.html