1.循环依赖问题
bean a 引入 bean b ,bean 吧 引入bean a 产生了相互依赖的问题。
2.场景
- 构造器的循环依赖
- field属性的循环依赖
3. 解决方式
三级缓存。
1.singletonObjects:单例对象的cache 第一级缓存singletonObjects里面放置的是实例化好的单例对象。
2.earlySingletonObjects:提前曝光的单例对象的Cache 第二级缓存earlySingletonObjects里面存放的是提前曝光的单例对象(没有完全装配好)。
3.singletonFactories:单例对象工厂的cache 第三级缓存singletonFactories里面存放的是要被实例化的对象的对象工厂。
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
创建bean
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
//bean是否在创建中
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
// 二级缓存获取
singletonObject = this.earlySingletonObjects.get(beanName);
//允许singletonFactories通过getObject()获取,就从三级缓存singletonFactory.getObject()(三级缓存)获取
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
//三级缓存 到二级缓存
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}