“这是我参与8月更文挑战的第31天,活动详情查看:8月更文挑战”
1.你知道spring的内部的三级缓存吗;
答案是:DefaultSingletonBeanRegistry
package org.springframework.beans.factory.support;
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
protected static final Object NULL_OBJECT = new Object();
protected final Log logger = LogFactory.getLog(this.getClass());
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256); //一级 单例-成品
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16); //三级--工厂bean
private final Map<String, Object> earlySingletonObjects = new HashMap(16); //二级 半成品
只有三级的key -value 中value是 工厂bean的创建 bean
结论:单例放缓存
理解: 因为我们第一次创建的对象是基于单例的,所有单例的对象走完了完整的生命周期--进入缓存--然后才开始可以解决循环依赖
由于photoType每次要重新创建一个对象,所以无法放入缓存中,也就不能使用三级缓存来解决循环依赖
2.三级缓存中的构成 ,三大MAP加上 四大方法;
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
/*
一级缓存,bean的单例对象,concurrentHashMap的一个集合安全的;
1.单例对象的缓存,单例池,
2.表示已经经历完整生命周期的对象--放成品的地方
3.已经初始化好了的bean的单例对象
*/
private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
/*
早期的单例对象,bean对象已经实例化,但是未完成初始化- 属性未填充完成
1.表示二级缓存,半成品,未加工完成的
2.bean中的对象也是单例的,但是已经实例化但未初始化完成
*/
private final Map<String, Object> earlySingletonObjects = new HashMap(16);
/*
三级缓存,singletonFactories,value 是objectFactory---->bean 工厂
没有单例的对象,有spring的容器,但是单例对象不存在,所以我们开始创建bean,然后doCreateBean()
1.得到单例对象getSingleton(),如果没有,创建bean的对象
2.实例化bean的对象,doCreateBean();
3.初始化bean对象,populateBean();
4.加入单例,也就是加入缓存addSingleton();
*/
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);