spring整套源码系列之【三级缓存关键源码】
2024-04-10 18:44:41 0 举报
spring整套源码系列之【三级缓存关键源码】
作者其他创作
大纲/内容
这里一开始是拿不到的,待会紧接着才会放入
//从二级缓存中移除(循环依赖的时候 早期对象存在于二级缓存)\t\t\tthis.earlySingletonObjects.remove(beanName);
//从beanWrapper中获取我们的早期对象\t\tfinal Object bean = instanceWrapper.getWrappedInstance();
判断bean是否在创建
这个地方加入三级缓存,而且也只有这一个地方往三级缓存存数据
是
返回创建的beanreturn exposedObject;
释放锁
属性填充
否
getEarlyBeanReference()方法其实不重要,重要的是我们在doCreateBean的时候把早期对象传进去了,这里很巧妙的获取到早期对象(并不是通过其他缓存获取,而是通过接口函数巧妙的获取)
getEarlyBeanReference这个方法里面虽然说执行了后置处理器(支持我们修改早期对象),除了这个重要的就是把早期bean直接返回,这个很巧妙,就是说你传什么来我返回什么回去,循环依赖那边就能取到了
synchronized (this.singletonObjects)
二级缓存只这里添加过,所以说二级缓存只是在循环依赖的情况下才会使用到
//用来记录保存已经处理的bean this.registeredSingletons.add(beanName);
初始化
存在
判断是否需要依赖注入
singletonObject == null
这里会回调这个接口函数,巧妙拿到早期对象
一级缓存对象锁
尝试去二级缓存中获取对象(二级缓存中的对象是一个早期对象)singletonObject = this.earlySingletonObjects.get(beanName);
用来记录保存已经处理的beanthis.registeredSingletons.add(beanName);
拿不到
从二级缓存移除this.earlySingletonObjects.remove(beanName);
直接从三级缓存中获取 ObjectFactory对象ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
这里在依赖注入的时候会再调用doGetBean
//ObjectFactory 包装对象从三级缓存中删除掉 this.singletonFactories.remove(beanName);
return (T) bean
判断三级缓存是否存在
判断二级缓存中是否能拿到singletonObject == null
返回二级缓存的结果return singletonObject;
是:获取需注入的bean,也就是调用doGetBean(...)
返回单例池拿到的beanreturn singletonObject;
sharedInstance != null
//尝试去缓存中获取对象 Object sharedInstance = getSingleton(beanName);
//从三级缓存中移除(针对的不是处理循环依赖的)\t\t\tthis.singletonFactories.remove(beanName);
否:需要创建bean
singletonsCurrentlyInCreation.add(beanName))这里就是标记当前的bean马上就要被创建了
在创建完bean后,需要把二三级缓存清理掉,因为二三级缓存只在循环依赖用到
singletonsCurrentlyInCreation.add(beanName))
实例化
这里也就是判断singletonsCurrentlyInCreation是否包含beanName
//尝试从单例缓存池中获取对象\t\t\tObject singletonObject = this.singletonObjects.get(beanName);
返回一级缓存的结果return singletonObject;
拿到
如果一级缓存拿不到且bean没有在创建中
在多线程中防止获取到不完整bean,这两把锁起到很大作用
单例缓存池中没有包含当前的bean!this.singletonObjects.containsKey(beanName)
0 条评论
下一页