源码笔记一
5.1版本
BeanDefinition
定义了Bean 的基本信息。却分了加入IOC容器的方式
循环依赖
容器 | 说明 |
---|---|
singletonObjects | 一级缓存 单列池 成品对象完成了属性赋值 |
isSingletonCurrentlyInCreation | list 记录正在创建的对象 beanName |
earlySingletonObjects | 二级缓存 存放这早期对象 bean调用了 构造方法,还没给bean属性赋值 |
singletonFactories | 三级缓存 存放bean信息和lambda 在IOC后期过程中,Bean调用构造方法时,吧早期对象包裹成ObjectFactory |
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
#getSingleton(java.lang.String, boolean)
/*
beanName : bean 的名称
allowEarlyRerence 是否允许暴露早期对象,通过参数可以控制是否能够解决以来循环
return: null - IOC容器加载单列bean的时候,第一次进来返回null
单列对象 - IOC加载了单列是咧,第二次进来获取到当前bean
早期对象 - 用于解决以来循环的问题
*/
protected Object getSingleton(String beanName, boolean allowEarlyReference)
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 通过beanName 从单列池中获取
Object singletonObject = this.singletonObjects.get(beanName);
// singletonsCurrentlyInCreation 里面存放这正在创建中的对象
if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
synchronized(this.singletonObjects) {
/*
earlySingletonObjects 二级缓存存放早期的对象
*/
singletonObject = this.earlySingletonObjects.get(beanName);
// 是否允许暴露的早期对象
if (singletonObject == null && allowEarlyReference) {
// 从三级 缓存中获取 当bean调用构造方法的时候,把早期对象包裹成一个ObjectFactory 放入三级缓存
ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
if (singletonFactory != null) {
//这里 getObject 拿到是一个 对象,不是bean
singletonObject = singletonFactory.getObject();
//吧这个对象放入 二级缓存
this.earlySingletonObjects.put(beanName, singletonObject);
// 吧对象从三级缓存删除
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
三级缓存放入点
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory #doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) // 第四次调用后置处理器 判断是否需要Aop【Aop提前】 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
普通bean 的获取不会尝试三级缓存
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory #doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) // fasle 不会走三级缓存,在aop 的时候会走三级缓存 Object earlySingletonReference = getSingleton(beanName, false);
AbstractAutowireCapableBeanFactory
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
#doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
这里调用了多次后置处理器