@SuppressWarnings("unchecked")protected<T>TdoGetBean(String name,@NullableClass<T> requiredType,@NullableObject[] args,boolean typeCheckOnly)throwsBeansException{String beanName =transformedBeanName(name);Object beanInstance;// Eagerly check singleton cache for manually registered singletons.Object sharedInstance =getSingleton(beanName);if(sharedInstance !=null&& args ==null){if(logger.isTraceEnabled()){if(isSingletonCurrentlyInCreation(beanName)){
logger.trace("Returning eagerly cached instance of singleton bean '"+ beanName
+"' that is not fully initialized yet - a consequence of a circular reference");}else{
logger.trace("Returning cached instance of singleton bean '"+ beanName +"'");}}
beanInstance =getObjectForBeanInstance(sharedInstance, name, beanName,null);}else{// Fail if we're already creating this bean instance:// We're assumably within a circular reference.if(isPrototypeCurrentlyInCreation(beanName)){thrownewBeanCurrentlyInCreationException(beanName);}// Check if bean definition exists in this factory.BeanFactory parentBeanFactory =getParentBeanFactory();if(parentBeanFactory !=null&&!containsBeanDefinition(beanName)){// Not found -> check parent.String nameToLookup =originalBeanName(name);if(parentBeanFactory instanceofAbstractBeanFactory){return((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);}elseif(args !=null){// Delegation to parent with explicit args.return(T) parentBeanFactory.getBean(nameToLookup, args);}elseif(requiredType !=null){// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}else{return(T) parentBeanFactory.getBean(nameToLookup);}}if(!typeCheckOnly){markBeanAsCreated(beanName);}StartupStep beanCreation =this.applicationStartup.start("spring.beans.instantiate").tag("beanName", name);try{if(requiredType !=null){
beanCreation.tag("beanType", requiredType::toString);}RootBeanDefinition mbd =getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// Guarantee initialization of beans that the current bean depends on.String[] dependsOn = mbd.getDependsOn();if(dependsOn !=null){for(String dep : dependsOn){if(isDependent(beanName, dep)){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '"+ beanName +"' and '"+ dep +"'");}registerDependentBean(dep, beanName);try{getBean(dep);}catch(NoSuchBeanDefinitionException ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"'"+ beanName +"' depends on missing bean '"+ dep +"'", ex);}}}// Create bean instance.if(mbd.isSingleton()){
sharedInstance =getSingleton(beanName,()->{try{returncreateBean(beanName, mbd, args);}catch(BeansException ex){// Explicitly remove instance from singleton cache: It might have been put // there// eagerly by the creation process, to allow for circular reference // resolution.// Also remove any beans that received a temporary reference to the bean.destroySingleton(beanName);throw ex;}});
beanInstance =getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}elseif(mbd.isPrototype()){// It's a prototype -> create a new instance.Object prototypeInstance =null;try{beforePrototypeCreation(beanName);
prototypeInstance =createBean(beanName, mbd, args);}finally{afterPrototypeCreation(beanName);}
beanInstance =getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else{String scopeName = mbd.getScope();if(!StringUtils.hasLength(scopeName)){thrownewIllegalStateException("No scope name defined for bean '"+ beanName +"'");}Scope scope =this.scopes.get(scopeName);if(scope ==null){thrownewIllegalStateException("No Scope registered for scope name '"+ scopeName +"'");}try{Object scopedInstance = scope.get(beanName,()->{beforePrototypeCreation(beanName);try{returncreateBean(beanName, mbd, args);}finally{afterPrototypeCreation(beanName);}});
beanInstance =getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch(IllegalStateException ex){thrownewScopeNotActiveException(beanName, scopeName, ex);}}}catch(BeansException ex){
beanCreation.tag("exception", ex.getClass().toString());
beanCreation.tag("message",String.valueOf(ex.getMessage()));cleanupAfterBeanCreationFailure(beanName);throw ex;}finally{
beanCreation.end();}}returnadaptBeanInstance(name, beanInstance, requiredType);}