// 注册别名是检查循环依赖
org.springframework.core.SimpleAliasRegistry.registerAlias()
{
checkForAliasCircle(name, alias); // 检查别名注册循环依赖
}
// 创建bean时检查循环依赖
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean()
{
if (sharedInstance != null && args == null) {
}
else {
if (isPrototypeCurrentlyInCreation(beanName)) { // 原型模式循环依赖,直接抛错误
throw new BeanCurrentlyInCreationException(beanName);
}
}
if (mbd.isSingleton()) { // scope="singleton" 或者 scope="" 单例模式
// sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { ... }
// ...
beforeSingletonCreation(beanName); // beanName 添加到singletonsCurrentlyInCreation中,如果添加不进去,表示循环引用
// ...
}
else if (mbd.isPrototype()) { // scope="prototype" 原型模式
// ...
try {
beforePrototypeCreation(beanName); // 记录beanName到prototypesCurrentlyInCreation中,表示创建中
prototypeInstance = createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
// ...
}
}