/*
是否需要提前曝光条件:1.单例 2.允许循环以来 3.bean正在创建中
*/
boolean earlySingletonExposure = (mbd.isSingleton()
&& this.allowCircularReferences
&& isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching
bean '" + beanName + "' to allow for resolving potential circular references");
}
/*
为避免后期循环依赖,可以在bean初始化完成前将创建实例的 ObjectFactory 加入工厂缓存
到这里↓
1.单例bean对象已经实例化,属性还没处理
2.将这个状态下的bean放到三级缓存singletonFactories中
3.该bean可以从三级缓存中拿到,通过引用可以找到堆上的这个对象
// 其中我们熟知的AoP就是在这里将 advice 动态织入bean中,若没有则直接返回 bean,不做任何处理
*/
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
Object exposedObject = bean;
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
SmartInstantiationAwareBeanPostProcessor ibp
= (SmartInstantiationAwareBeanPostProcessor) bp;
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
}
}
}
return exposedObject;
}
判断是否需要加入三级缓存,也就是判断有可能存在循环依赖。
曝光条件:1.单例 2.允许循环以来 3.bean正在创建中。
如果满足条件,会记录该 bean 及对应的 ObejctFactory 到三级缓存 singletonFactories 中。这样做的目的是为了解决循环依赖。
其中 getEarlyBeanReference 方法可以看到,没有特殊的逻辑只是调用了一些处理器,我们熟知的 AOP 就是在这里将 advice 动态织入bean中,若没有任何的处理器则直接返回 bean,不做任何处理。