spring解决互相依赖问题

AbstractApplicationContextrefresh() 方法出发,进入 finishBeanFactoryInitialization() 方法再进入 preInstantiateSingletons() 方法再进入 getBean() 方法再进入 doGetBean() 方法。

/**
 * 根据指定的名称、类型、参数等获取Bean实例。
 *
 * @param name           Bean的名称
 * @param requiredType   被请求Bean的类型
 * @param args           构造函数参数
 * @param typeCheckOnly  是否只进行类型检查
 * @return 被请求的Bean实例
 * @throws BeansException 如果无法获取Bean实例
 */
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
    String beanName = this.transformedBeanName(name);  // 转换Bean名称(别名或者FactoryBean名称)
    Object sharedInstance = this.getSingleton(beanName);  // 获取单例Bean实例
    Object beanInstance;
​
    if (sharedInstance != null && args == null) {
        if (this.logger.isTraceEnabled()) {
            if (this.isSingletonCurrentlyInCreation(beanName)) {
                this.logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
            } else {
                this.logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }
        beanInstance = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition) null);  // 获取缓存的单例Bean实例
    } else {
        if (this.isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }
        BeanFactory parentBeanFactory = this.getParentBeanFactory();
        if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {  // 在父级BeanFactory中查找Bean定义
            String nameToLookup = this.originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
                return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);  // 在父级BeanFactory中获取Bean实例
            }
            if (args != null) {
                return parentBeanFactory.getBean(nameToLookup, args);  // 在父级BeanFactory中根据名称和参数获取Bean实例
            }
            if (requiredType != null) {
                return parentBeanFactory.getBean(nameToLookup, requiredType);  // 在父级BeanFactory中根据名称和类型获取Bean实例
            }
            return parentBeanFactory.getBean(nameToLookup);  // 在父级BeanFactory中根据名称获取Bean实例
        }
​
        if (!typeCheckOnly) {
            this.markBeanAsCreated(beanName);
        }
​
        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate").tag("beanName", name);
        try {
            if (requiredType != null) {
                beanCreation.tag("beanType", requiredType::toString);
            }
            RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);  // 获取合并的Bean定义
            this.checkMergedBeanDefinition(mbd, beanName, args);  // 检查合并的Bean定义
​
            String[] dependsOn = mbd.getDependsOn();
            if (dependsOn != null) {  // 处理依赖关系
                for (String dep : dependsOn) {
                    if (this.isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                    }
                    this.registerDependentBean(dep, beanName);
                    try {
                        this.getBean(dep);  // 获取依赖的Bean实例
                    } catch (NoSuchBeanDefinitionException var31) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var31);
                    }
                }
            }
​
            if (mbd.isSingleton()) {  // 单例Bean
                sharedInstance = this.getSingleton(beanName, () -> {
                    try {
                        return this.createBean(beanName, mbd, args);  // 创建单例Bean实例
                    } catch (BeansException var5) {
                        this.destroySingleton(beanName);
                        throw var5;
                    }
                });
                beanInstance = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);  // 获取单例Bean实例
            } else if (mbd.isPrototype()) {  // 原型Bean
                Object prototypeInstance;
                try {
                    this.beforePrototypeCreation(beanName);
                    prototypeInstance = this.createBean(beanName, mbd, args);  // 创建原型Bean实例
                } finally {
                    this.afterPrototypeCreation(beanName);
                }
                beanInstance = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);  // 获取原型Bean实例
            } else {  // 其他作用域的Bean
                String scopeName = mbd.getScope();
                if (!StringUtils.hasLength(scopeName)) {
                    throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
                }
                Scope scope = (Scope) this.scopes.get(scopeName);
                if (scope == null) {
                    throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                }
                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        this.beforePrototypeCreation(beanName);
                        Object var4;
                        try {
                            var4 = this.createBean(beanName, mbd, args);  // 创建作用域Bean实例
                        } finally {
                            this.afterPrototypeCreation(beanName);
                        }
                        return var4;
                    });
                    beanInstance = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);  // 获取作用域Bean实例
                } catch (IllegalStateException var30) {
                    throw new ScopeNotActiveException(beanName, scopeName, var30);
                }
            }
        } catch (BeansException var32) {
            beanCreation.tag("exception", var32.getClass().toString());
            beanCreation.tag("message", String.valueOf(var32.getMessage()));
            this.cleanupAfterBeanCreationFailure(beanName);
            throw var32;
        } finally {
            beanCreation.end();
        }
    }
    return this.adaptBeanInstance(name, beanInstance, requiredType);  // 转换Bean实例类型并返回
}

调用createBean接口,实现类createBean()

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    BeanWrapper instanceWrapper = null;
  
    // 检查是否是单例,并从factoryBeanInstanceCache中移除实例包装器
    if (mbd.isSingleton()) {
        instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
    }
​
    // 如果实例包装器为null,则创建一个实例
    if (instanceWrapper == null) {
        instanceWrapper = this.createBeanInstance(beanName, mbd, args);
    }
​
    // 获取bean的实例和类型,将类型设置为已解析的目标类型
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }
​
    // 在同步块中应用合并后的Bean定义的后置处理器
    synchronized(mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            } catch (Throwable var17) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
            }
            mbd.postProcessed = true;
        }
    }
​
    // 检查是否允许循环引用,并且实例当前正在创建,如果是则提前暴露单例
    boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
    if (earlySingletonExposure) {
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
        }
        // 将提前暴露的单例存储到getSingletonMutex()中
        this.addSingletonFactory(beanName, () -> {
            return this.getEarlyBeanReference(beanName, mbd, bean);
        });
    }
​
    Object exposedObject = bean;
​
    try {
        // 填充bean的属性值
        this.populateBean(beanName, mbd, instanceWrapper);
        // 初始化bean
        exposedObject = this.initializeBean(beanName, exposedObject, mbd);
    } catch (Throwable var18) {
        if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
            throw (BeanCreationException)var18;
        }
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
    }
​
    if (earlySingletonExposure) {
        // 获取提前暴露的单例引用
        Object earlySingletonReference = this.getSingleton(beanName, false);
        if (earlySingletonReference != null) {
            // 如果exposedObject和bean相同,则将exposedObject设置为提前暴露的单例
            if (exposedObject == bean) {
                exposedObject = earlySingletonReference;
            } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
                // 检查是否存在依赖该bean的其他bean,如果存在,则抛出异常
                String[] dependentBeans = this.getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                String[] var12 = dependentBeans;
                int var13 = dependentBeans.length;
​
                for(int var14 = 0; var14 < var13; ++var14) {
                    String dependentBean = var12[var14];
                    if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }
​
                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.");
                }
            }
        }
    }
​
    try {
        // 注册用于销毁的bean(DisposableBean)
        this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
        return exposedObject;
    } catch (BeanDefinitionValidationException var16) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
    }
}

创建bean时会判断是否需要其他对象,如果是,丢入addgetEarlyBeanReference(也就是二级缓存),暴露引用,这也是为aop做准备的操作之一,并将其丢入addSingletonFactory(也就是三级缓存)

protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    Object exposedObject = bean;
    SmartInstantiationAwareBeanPostProcessor bp;
​
    // 检查是否存在实例化感知的Bean后置处理器,并对每个后置处理器应用提前引用逻辑
    if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
        for (Iterator var5 = this.getBeanPostProcessorCache().smartInstantiationAware.iterator(); var5.hasNext(); exposedObject = bp.getEarlyBeanReference(exposedObject, beanName)) {
            bp = (SmartInstantiationAwareBeanPostProcessor) var5.next();
        }
    }
​
    return exposedObject;
}

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
​
    synchronized (this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            // 将单例工厂对象加入singletonFactories中,用于创建bean实例
            this.singletonFactories.put(beanName, singletonFactory);
            // 从earlySingletonObjects中移除beanName,提前暴露的bean实例将不再被访问
            this.earlySingletonObjects.remove(beanName);
            // 将beanName加入registeredSingletons中,表示该bean已经注册为单例
            this.registeredSingletons.add(beanName);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值