三级缓存bean的创建过程(一)

234 阅读2分钟

这是我参与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

image.png

结论:单例放缓存

image.png

理解: 因为我们第一次创建的对象是基于单例的,所有单例的对象走完了完整的生命周期--进入缓存--然后才开始可以解决循环依赖

  由于photoType每次要重新创建一个对象,所以无法放入缓存中,也就不能使用三级缓存来解决循环依赖

2.三级缓存中的构成 ,三大MAP加上 四大方法;

image.png

image.png

image.png



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);
    
   

AB各自的创建过程中,缓存位置如何变化

最后的地方

image.png