/*是否需要提前曝光条件:1.单例 2.允许循环以来 3.bean正在创建中*/boolean earlySingletonExposure = (mbd.isSingleton()&& this.allowCircularReferences&& isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isTraceEnabled()) {logger.trace("Eagerly cachingbean '" + 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,不做任何处理。
