protectedObjectdoCreateBean(String beanName,RootBeanDefinition mbd,@NullableObject[] args)throwsBeanCreationException{BeanWrapper instanceWrapper =null;if(mbd.isSingleton()){instanceWrapper =(BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);}if(instanceWrapper ==null){// 实例化instanceWrapper =this.createBeanInstance(beanName, mbd, args);}Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if(beanType !=NullBean.class){mbd.resolvedTargetType = beanType;}synchronized(mbd.postProcessingLock){if(!mbd.postProcessed){try{this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch(Throwable ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.markAsPostProcessed();}}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");}this.addSingletonFactory(beanName,()->this.getEarlyBeanReference(beanName, mbd, bean));}Object exposedObject = bean;try{// 填充属性this.populateBean(beanName, mbd, instanceWrapper);// 初始化exposedObject =this.initializeBean(beanName, exposedObject, mbd);}catch(Throwable var18){if(var18 instanceofBeanCreationException bce){if(beanName.equals(bce.getBeanName())){throw bce;}}thrownewBeanCreationException(mbd.getResourceDescription(), beanName, var18.getMessage(), var18);}if(earlySingletonExposure){Object earlySingletonReference =this.getSingleton(beanName,false);if(earlySingletonReference !=null){if(exposedObject == bean){exposedObject = earlySingletonReference;}elseif(!this.allowRawInjectionDespiteWrapping &&this.hasDependentBean(beanName)){String[] dependentBeans =this.getDependentBeans(beanName);Set<String> actualDependentBeans =CollectionUtils.newLinkedHashSet(dependentBeans.length);for(String dependentBean : dependentBeans){if(!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)){actualDependentBeans.add(dependentBean);}}if(!actualDependentBeans.isEmpty()){thrownewBeanCurrentlyInCreationException(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{this.registerDisposableBeanIfNecessary(beanName, bean, mbd);return exposedObject;}catch(BeanDefinitionValidationException ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Invalid destruction signature", ex);}}