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