1. // 判断处理依赖引用
    2. if (earlySingletonExposure) {
    3. // 从缓存中获取bean
    4. Object earlySingletonReference = getSingleton(beanName, false);
    5. if (earlySingletonReference != null) {
    6. if (exposedObject == bean) {
    7. exposedObject = earlySingletonReference;
    8. // 判断是否有其他依赖的bean
    9. } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
    10. String[] dependentBeans = getDependentBeans(beanName);
    11. Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
    12. for (String dependentBean : dependentBeans) {
    13. if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
    14. actualDependentBeans.add(dependentBean);
    15. }
    16. }
    17. // 如果依然有bean在创建中,异常
    18. if (!actualDependentBeans.isEmpty()) {
    19. throw new BeanCurrentlyInCreationException(beanName,
    20. "Bean with name '" + beanName + "' has been injected into other beans [" +
    21. StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
    22. "] in its raw version as part of a circular reference, but has eventually been " +
    23. "wrapped. This means that said other beans do not use the final version of the " +
    24. "bean. This is often the result of over-eager type matching - consider using " +
    25. "'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
    26. }
    27. }
    28. }
    29. }
    1. 从缓存中尝试获取该bean;
    2. 判断 exposedObject == bean ,最开始它们是相等的 Object exposedObject = bean;经过初始化后,exposedObject 有可能变成了代理对象。如果相等的话,那么说明没有被代理;不等的话,exposedObject 已经变成了 bean 的代理对象。
    3. 检测这个代理对象所有依赖的 bean 是否都初始化好了,如果没有的话 BeanCurrentlyInCreationException 。