// 判断处理依赖引用
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 。