/**一级缓存,用于存放完全初始化好的 bean,从该缓存中取出的 bean 可以直接使用*/ private final map<string, object> singletonobjects = new concurrenthashmap<>(256); /**三级缓存 存放 bean 工厂对象,用于解决循环依赖*/ private final map<string, objectfactory<?>> singletonfactories = new hashmap<>(16); /**二级缓存 存放原始的 bean 对象(尚未填充属性),用于解决循环依赖*/ private final map<string, object> earlysingletonobjects = new hashmap<>(16);
【1】 getsingleton(beanname):源码如下:
//查询缓存 object sharedinstance = getsingleton(beanname); //缓存中存在并且args是null if (sharedinstance != null && args == null) { //.......省略部分代码 //直接获取bean实例 bean = getobjectforbeaninstance(sharedinstance, name, beanname, null); } //getsingleton源码,defaultsingletonbeanregistry#getsingleton protected object getsingleton(string beanname, boolean allowearlyreference) { //先从一级缓存中获取已经实例化属性赋值完成的bean object singletonobject = this.singletonobjects.get(beanname); //一级缓存不存在,并且bean正处于创建的过程中 if (singletonobject == null && issingletoncurrentlyincreation(beanname)) { synchronized (this.singletonobjects) { //从二级缓存中查询,获取bean的早期引用,实例化完成但是未赋值完成的bean singletonobject = this.earlysingletonobjects.get(beanname); //二级缓存中不存在,并且允许创建早期引用(二级缓存中添加) 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; }
【2】addsingletonfactory:源码如下
//中间省略部分代码。。。。。 //创建bean的源码,在abstractautowirecapablebeanfactory#docreatebean方法中 if (instancewrapper == null) { //实例化bean instancewrapper = createbeaninstance(beanname, mbd, args); } //允许提前暴露 if (earlysingletonexposure) { //添加到三级缓存中 addsingletonfactory(beanname, () -> getearlybeanreference(beanname, mbd, bean)); } try { //属性装配,属性赋值的时候,如果有发现属性引用了另外一个bean,则调用getbean方法 populatebean(beanname, mbd, instancewrapper); //初始化bean,调用init-method,afterproperties方法等操作 exposedobject = initializebean(beanname, exposedobject, mbd); } } //添加到三级缓存的源码,在defaultsingletonbeanregistry#addsingletonfactory protected void addsingletonfactory(string beanname, objectfactory<?> singletonfactory) { synchronized (this.singletonobjects) { //一级缓存中不存在 if (!this.singletonobjects.containskey(beanname)) { //放入三级缓存 this.singletonfactories.put(beanname, singletonfactory); //从二级缓存中移除, this.earlysingletonobjects.remove(beanname); this.registeredsingletons.add(beanname); } } }
【3】addsingleton:源码如下:
//获取单例对象的方法,defaultsingletonbeanregistry#getsingleton //调用createbean实例化bean singletonobject = singletonfactory.getobject(); //。。。。中间省略部分代码 //docreatebean之后才调用,实例化,属性赋值完成的bean装入一级缓存,可以直接使用的bean addsingleton(beanname, singletonobject); //addsingleton源码,在defaultsingletonbeanregistry#addsingleton方法中 protected void addsingleton(string beanname, object singletonobject) { synchronized (this.singletonobjects) { //一级缓存中添加 this.singletonobjects.put(beanname, singletonobject); //移除三级缓存 this.singletonfactories.remove(beanname); //移除二级缓存 this.earlysingletonobjects.remove(beanname); this.registeredsingletons.add(beanname); } }
【1】为什么spring不能解决构造器的循环依赖?
【2】为什么多实例bean不能解决循环依赖?
如对本文有疑问, 点击进行留言回复!!
解决idea中出现“illegal character U+200B” 问题
荐 为什么加了@Transactional注解,事务没有回滚?
Attribute ‘sklearn.linear_model._logistic.LogisticRegression.multi_class‘ must be explicitly set to
Java/Python实现 LeetCode剑指Offer 14-I.剪绳子(动态规划)
网友评论