1. /*
    2. 是否需要提前曝光条件:1.单例 2.允许循环以来 3.bean正在创建中
    3. */
    4. boolean earlySingletonExposure = (mbd.isSingleton()
    5. && this.allowCircularReferences
    6. && isSingletonCurrentlyInCreation(beanName));
    7. if (earlySingletonExposure) {
    8. if (logger.isTraceEnabled()) {
    9. logger.trace("Eagerly caching
    10. bean '" + beanName + "' to allow for resolving potential circular references");
    11. }
    12. /*
    13. 为避免后期循环依赖,可以在bean初始化完成前将创建实例的 ObjectFactory 加入工厂缓存
    14. 到这里↓
    15. 1.单例bean对象已经实例化,属性还没处理
    16. 2.将这个状态下的bean放到三级缓存singletonFactories中
    17. 3.该bean可以从三级缓存中拿到,通过引用可以找到堆上的这个对象
    18. // 其中我们熟知的AoP就是在这里将 advice 动态织入bean中,若没有则直接返回 bean,不做任何处理
    19. */
    20. addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    21. }
    1. protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    2. Object exposedObject = bean;
    3. if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    4. for (BeanPostProcessor bp : getBeanPostProcessors()) {
    5. if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
    6. SmartInstantiationAwareBeanPostProcessor ibp
    7. = (SmartInstantiationAwareBeanPostProcessor) bp;
    8. exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
    9. }
    10. }
    11. }
    12. return exposedObject;
    13. }

    判断是否需要加入三级缓存,也就是判断有可能存在循环依赖。
    曝光条件:1.单例 2.允许循环以来 3.bean正在创建中。
    如果满足条件,会记录该 bean 及对应的 ObejctFactory 到三级缓存 singletonFactories 中。这样做的目的是为了解决循环依赖。
    其中 getEarlyBeanReference 方法可以看到,没有特殊的逻辑只是调用了一些处理器,我们熟知的 AOP 就是在这里将 advice 动态织入bean中,若没有任何的处理器则直接返回 bean,不做任何处理。