/**
* getBean(beanName)方法的实现
* 实现类:org.springframework.beans.factory.support.AbstractBeanFactory
*/protected<T> T doGetBean(final String name,@Nullablefinal Class<T> requiredType,@Nullablefinal Object[] args,boolean typeCheckOnly)throws BeansException {final String beanName =transformedBeanName(name);
Object bean;// 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 +"'");}}
bean =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);}try{final 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);}}}// 创建bean实例...if(mbd.isSingleton()){// 函数式接口
sharedInstance =getSingleton(beanName,()->{try{returncreateBean(beanName, mbd, args);}catch(BeansException ex){// 从单例缓存中显式删除实例:创建过程可能急切地将其放置在该实例中,以允许循环引用解析。还删除所有接收到对该bean的临时引用的beandestroySingleton(beanName);throw ex;}});
bean =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);}
bean =getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else{
String scopeName = mbd.getScope();final 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);}});
bean =getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch(IllegalStateException ex){thrownewBeanCreationException(beanName,"Scope '"+ scopeName +"' is not active for the current thread; consider "+"defining a scoped proxy for this bean if you intend to refer to it from a singleton",
ex);}}}catch(BeansException ex){cleanupAfterBeanCreationFailure(beanName);throw ex;}}// Check if required type matches the type of the actual bean instance.if(requiredType != null &&!requiredType.isInstance(bean)){try{
T convertedBean =getTypeConverter().convertIfNecessary(bean, requiredType);if(convertedBean == null){thrownewBeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch(TypeMismatchException ex){if(logger.isTraceEnabled()){
logger.trace("Failed to convert bean '"+ name +"' to required type '"+
ClassUtils.getQualifiedName(requiredType)+"'", ex);}thrownewBeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return(T) bean;}
4. 获取单实例bean
/**
* getSingleton()方法的实现类
* 实现类:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
*/public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory){
Assert.notNull(beanName,"Bean name must not be null");synchronized(this.singletonObjects){
Object singletonObject =this.singletonObjects.get(beanName);if(singletonObject == null){if(this.singletonsCurrentlyInDestruction){thrownewBeanCreationNotAllowedException(beanName,"Singleton bean creation not allowed while singletons of this factory are in destruction "+"(Do not request a bean from a BeanFactory in a destroy method implementation!)");}if(logger.isDebugEnabled()){
logger.debug("Creating shared instance of singleton bean '"+ beanName +"'");}beforeSingletonCreation(beanName);boolean newSingleton =false;boolean recordSuppressedExceptions =(this.suppressedExceptions == null);if(recordSuppressedExceptions){this.suppressedExceptions =newLinkedHashSet<>();}try{// 该方法实际调用的是传入的lamda表达式的CreateBean()方法
singletonObject = singletonFactory.getObject();
newSingleton =true;}catch(IllegalStateException ex){// Has the singleton object implicitly appeared in the meantime ->// if yes, proceed with it since the exception indicates that state.
singletonObject =this.singletonObjects.get(beanName);if(singletonObject == null){throw ex;}}catch(BeanCreationException ex){if(recordSuppressedExceptions){for(Exception suppressedException :this.suppressedExceptions){
ex.addRelatedCause(suppressedException);}}throw ex;}finally{if(recordSuppressedExceptions){this.suppressedExceptions = null;}afterSingletonCreation(beanName);}if(newSingleton){addSingleton(beanName, singletonObject);}}return singletonObject;}}
/**
* 5.createBean()方法的实现类
* 实现:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
*
*/protected Object doCreateBean(final String beanName,final RootBeanDefinition mbd,final@Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.
BeanWrapper instanceWrapper = null;if(mbd.isSingleton()){
instanceWrapper =this.factoryBeanInstanceCache.remove(beanName);}if(instanceWrapper == null){// 1. 创建bean实例
instanceWrapper =createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();if(beanType != NullBean.class){
mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized(mbd.postProcessingLock){if(!mbd.postProcessed){try{applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch(Throwable ex){thrownewBeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}
mbd.postProcessed =true;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.boolean earlySingletonExposure =(mbd.isSingleton()&&this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if(earlySingletonExposure){if(logger.isTraceEnabled()){
logger.trace("Eagerly caching bean '"+ beanName +"' to allow for resolving potential circular references");}addSingletonFactory(beanName,()->getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.
Object exposedObject = bean;try{// 2. bean实例属性赋值populateBean(beanName, mbd, instanceWrapper);// 3. 初始化bean
exposedObject =initializeBean(beanName, exposedObject, mbd);}catch(Throwable ex){if(ex instanceofBeanCreationException&& beanName.equals(((BeanCreationException) ex).getBeanName())){throw(BeanCreationException) ex;}else{thrownewBeanCreationException(
mbd.getResourceDescription(), beanName,"Initialization of bean failed", ex);}}if(earlySingletonExposure){
Object earlySingletonReference =getSingleton(beanName,false);if(earlySingletonReference != null){if(exposedObject == bean){
exposedObject = earlySingletonReference;}elseif(!this.allowRawInjectionDespiteWrapping &&hasDependentBean(beanName)){
String[] dependentBeans =getDependentBeans(beanName);
Set<String> actualDependentBeans =newLinkedHashSet<>(dependentBeans.length);for(String dependentBean : dependentBeans){if(!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 "+"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");}}}}// Register bean as disposable.try{registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch(BeanDefinitionValidationException ex){thrownewBeanCreationException(
mbd.getResourceDescription(), beanName,"Invalid destruction signature", ex);}return exposedObject;}