spring源码分析之bean的实例化过程

spring源码分析之bean的实例化过程

一、开始

getBean的完整流程读懂此图相信获取bean的整个流程你已经明白
在这里插入图片描述

循环依赖(一图破万法)
在这里插入图片描述

二、代码分析
在这里插入图片描述

i1:org.springframework.beans.factory.support.AbstractBeanFactory#getBean

 public Object getBean(String name) throws BeansException {
    
      

                return doGetBean(name, null, null, false);  

         }
protected <T> T doGetBean(
			final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
			throws BeansException {
    
    
 	/**  

                 * 转换对应的beanName   你们可能认为传入进来的name 不就是beanName么?  

                 * 传入进来的可能是别名,也有可能是是factoryBean  

                 * 1)去除factoryBean的修饰符  name                  "&instA"            >instA  

                 * 2)取指定的alias所表示的最终beanName    比如传入的是别名为ia---->指向为instA的bean,那么就返回instA  

                 **/  
		final String beanName = transformedBeanName(name);
		Object bean;
		/**  

            * 设计的精髓  

            * 检查实例缓存中对象工厂缓存中是包含对象(从这里返回的可能是实例话好的,也有可能是没有实例化好的)  

            * 为什么要这段代码?  

            * 因为单实例bean创建可能存主依赖注入的情况,而为了解决循环依赖问题,在对象刚刚创建好(属性还没有赋值)  

            * 的时候,就会把对象包装为一个对象工厂暴露出去(加入到对象工厂缓存中),一但下一个bean要依赖他,就直接可以从缓存中获取. 

            * */  


		// Eagerly check singleton cache for manually registered singletons.
		Object sharedInstance = getSingleton(beanName);
		if (sharedInstance != null && args == null) {
    
    
			if (logger.isDebugEnabled()) {
    
    
				if (isSingletonCurrentlyInCreation(beanName)) {
    
    
					logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
							"' that is not fully initialized yet - a consequence of a circular reference");
				}
				else {
    
    
					logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
				}
			}
   /**  

                      * 若从缓存中的sharedInstance是原始的bean(属性还没有进行实例化,那么在这里进行处理)  

                      * 或者是factoryBean 返回的是工厂bean的而不是我们想要的getObject()返回的bean ,就会在这里处理  

                      **/  
			bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
		}

		else {
    
    
 /**  

                      * 为什么spring对原型对象就不能解决循环依赖的问题了?  

                      * 因为spring ioc对原型对象不进行缓存,所以无法提前暴露对象,每次调用都会创建新的对象.  

                      *   

                      * 比如对象A中的属性对象B,对象B中有属性A, 在创建A的时候 检查到依赖对象B,那么就会返过来创建对象B,在创建B的过 

                      * 又发现依赖对象A,由于是原型对象的,ioc容器是不会对实例进行缓存的 所以无法解决循环依赖的问题  

                      *   

                      * */  
			// Fail if we're already creating this bean instance:
			// We're assumably within a circular reference.
			if (isPrototypeCurrentlyInCreation(beanName)) {
    
    
				throw new BeanCurrentlyInCreationException(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 (args != null) {
    
    
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else {
    
    
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
			}

			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)) {
    
    
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
						}
						registerDependentBean(dep, beanName);
						try {
    
    
							getBean(dep);
						}
						catch (NoSuchBeanDefinitionException ex) {
    
    
							throw new BeanCreationException(mbd.getResourceDescription(), beanName,
									"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
						}
					}
				}

				// Create bean instance.
				//创建单例bean
				if (mbd.isSingleton()) {
    
    
					sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {
    
    
						@Override
						public Object getObject() throws BeansException {
    
    
							try {
    
    
								return createBean(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;
							}
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}
			//创建非单例bean
				else if (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) {
    
    
						throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
					}
					try {
    
    
						Object scopedInstance = scope.get(beanName, new ObjectFactory<Object>() {
    
    
							@Override
							public Object getObject() throws BeansException {
    
    
								beforePrototypeCreation(beanName);
								try {
    
    
									return createBean(beanName, mbd, args);
								}
								finally {
    
    
									afterPrototypeCreation(beanName);
								}
							}
						});
						bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
					}
					catch (IllegalStateException ex) {
    
    
						throw new BeanCreationException(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 && bean != null && !requiredType.isInstance(bean)) {
    
    
			try {
    
    
				return getTypeConverter().convertIfNecessary(bean, requiredType);
			}
			catch (TypeMismatchException ex) {
    
    
				if (logger.isDebugEnabled()) {
    
    
					logger.debug("Failed to convert bean '" + name + "' to required type '" +
							ClassUtils.getQualifiedName(requiredType) + "'", ex);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}

i2.2>:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton 去缓存中 获取bean源码分析

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
    
    
     //去缓存map中获取以及实例化好的bean对象 
		Object singletonObject = this.singletonObjects.get(beanName);
		//缓存中没有获取到,并且当前bean是否在正在创建
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
    
    
			//加锁,防止并发创建
			synchronized (this.singletonObjects) {
    
    
			//保存早期对象缓存中是否有该对象
				singletonObject = this.earlySingletonObjects.get(beanName);
				//早期对象缓存没有并且允许早起引用
				if (singletonObject == null && allowEarlyReference) {
    
    
				//早期对象暴露工厂缓存(用来解决循环依赖的)
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
    
    
					//调用方法获早期对象
						singletonObject = singletonFactory.getObject();
						//放入到早期对象缓存中
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}

i2.3>:org.springframework.beans.factory.support.AbstractBeanFactory#getObjectForBeanInstance 在Bean的生命周期中,getObjectForBeanInstance方法是频繁使用的方法,无论是从缓存中获取出来的bean还是 根据scope创建出来的bean,都要通过该方法进行检查。
①:检查当前bean是否为factoryBean,如果是就需要调用该对象的getObject()方法来返回我们需要的bean对象

protected Object getObjectForBeanInstance(
			Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {
    
    

		// Don't let calling code try to dereference the factory if the bean isn't a factory.
		//判断name为以 &开头的但是 又不是factoryBean类型的 就抛出异常
		if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
    
    
			throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());
		}

		// Now we have the bean instance, which may be a normal bean or a FactoryBean.
		// If it's a FactoryBean, we use it to create a bean instance, unless the
		// caller actually wants a reference to the factory.
		/** * 现在我们有了这个bean,它可能是一个普通bean 也有可能是工厂bean 
		若是工厂bean,我们使用他来创建实例,
		当如果想要获取的是工厂实例而不是工厂bean的getObject()对应的bean,我们应该传入&开头 * */
		if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
    
    
			return beanInstance;
		}

		Object object = null;
		if (mbd == null) {
    
    
			/* * 如果 mbd 为空,则从缓存中加载 bean。FactoryBean 生成的单例 bean 会被缓存 
			* 在 factoryBeanObjectCache 集合中,不用每次都创建 */
			object = getCachedObjectForFactoryBean(beanName);
		}
		if (object == null) {
    
    
			// Return bean instance from factory.
			FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
			// Caches object obtained from FactoryBean if it is a singleton.
			if (mbd == null && containsBeanDefinition(beanName)) {
    
    
				mbd = getMergedLocalBeanDefinition(beanName);
			}
			boolean synthetic = (mbd != null && mbd.isSynthetic());
			// 调用 getObjectFromFactoryBean 方法继续获取实例
			object = getObjectFromFactoryBean(factory, beanName, !synthetic);
		}
		return object;
	}

getObjectFromFactoryBean核心方法

protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
    
    

/* * FactoryBean 也有单例和非单例之分,针对不同类型的 FactoryBean,这里有两种处理方式: 
* 1. 单例 FactoryBean 生成的 bean 实例也认为是单例类型。需放入缓存中,供后续重复使用
*  * 2. 非单例 FactoryBean 生成的 bean 实例则不会被放入缓存中,每次都会创建新的实例 */
		if (factory.isSingleton() && containsSingleton(beanName)) {
    
    
			synchronized (getSingletonMutex()) {
    
    
				Object object = this.factoryBeanObjectCache.get(beanName);
				if (object == null) {
    
    
					object = doGetObjectFromFactoryBean(factory, beanName);
					// Only post-process and store if not put there already during getObject() call above
					// (e.g. because of circular reference processing triggered by custom getBean calls)
					Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
					if (alreadyThere != null) {
    
    
						object = alreadyThere;
					}
					else {
    
    
						if (object != null && shouldPostProcess) {
    
    
							if (isSingletonCurrentlyInCreation(beanName)) {
    
    
								// Temporarily return non-post-processed object, not storing it yet..
								return object;
							}
							beforeSingletonCreation(beanName);
							try {
    
    
								object = postProcessObjectFromFactoryBean(object, beanName);
							}
							catch (Throwable ex) {
    
    
								throw new BeanCreationException(beanName,
										"Post-processing of FactoryBean's singleton object failed", ex);
							}
							finally {
    
    
								afterSingletonCreation(beanName);
							}
						}
						if (containsSingleton(beanName)) {
    
    
							this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
						}
					}
				}
				return (object != NULL_OBJECT ? object : null);
			}
		}
		else {
    
    
			Object object = doGetObjectFromFactoryBean(factory, beanName);
			if (object != null && shouldPostProcess) {
    
    
				try {
    
    
					object = postProcessObjectFromFactoryBean(object, beanName);
				}
				catch (Throwable ex) {
    
    
					throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
				}
			}
			return object;
		}
	}

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton根据scope 的添加来创建bean

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    
    
		Assert.notNull(beanName, "'beanName' must not be null");
		synchronized (this.singletonObjects) {
    
    
			Object singletonObject = this.singletonObjects.get(beanName);
			if (singletonObject == null) {
    
    
				if (this.singletonsCurrentlyInDestruction) {
    
    
					throw new BeanCreationNotAllowedException(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 + "'");
				}
				//打标.....把正在创建的bean 的标识设置为ture singletonsCurrentlyInDestruction
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
    
    
					this.suppressedExceptions = new LinkedHashSet<Exception>();
				}
				try {
    
    
				//调用单实例bean的创建
					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 != NULL_OBJECT ? singletonObject : null);
		}
	}

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    
    
		if (logger.isDebugEnabled()) {
    
    
			logger.debug("Creating instance of bean '" + beanName + "'");
		}
		RootBeanDefinition mbdToUse = mbd;

		// Make sure bean class is actually resolved at this point, and
		// clone the bean definition in case of a dynamically resolved Class
		// which cannot be stored in the shared merged bean definition.
		Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
		if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
    
    
			mbdToUse = new RootBeanDefinition(mbd);
			mbdToUse.setBeanClass(resolvedClass);
		}

		// Prepare method overrides.
		try {
    
    
			mbdToUse.prepareMethodOverrides();
		}
		catch (BeanDefinitionValidationException ex) {
    
    
			throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
					beanName, "Validation of method overrides failed", ex);
		}

		try {
    
    
			// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
			//给bean的后置处理器一个机会来生成一个代理对象返回,在aop模块进行详细讲解
			//调用后置处理器 用来处理创建代理对象的,但是 ,我代理对象不再这里创建(因为我的对象还没有进行实例  		       
			//化)把我们的切面和通知(增强器)进行缓存下来
			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
			if (bean != null) {
    
    
				return bean;
			}
		}
		catch (Throwable ex) {
    
    
			throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
					"BeanPostProcessor before instantiation of bean failed", ex);
		}
           //真正进行主要的业务逻辑方法来进行创建bean
		Object beanInstance = doCreateBean(beanName, mbdToUse, args);
		if (logger.isDebugEnabled()) {
    
    
			logger.debug("Finished creating instance of bean '" + beanName + "'");
		}
		return beanInstance;
	}

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean 真正 的创建bean的逻辑

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
			throws BeanCreationException {
    
    

		// Instantiate the bean.
		BeanWrapper instanceWrapper = null;
		if (mbd.isSingleton()) {
    
    
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {
    
    
		/** * 如果存在工厂方法则使用工厂方法进行初始化 * 一个类有多个构造函数,每个构造函数都有不同的参数,所以需要根据参数锁定构造 函数并进行初始化。 * 如果既不存在工厂方法也不存在带有参数的构造函数,则使用默认的构造函数进行 bean 的实例化 * */
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
		Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
		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) {
    
    
					throw new BeanCreationException(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.isDebugEnabled()) {
    
    
				logger.debug("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			addSingletonFactory(beanName, new ObjectFactory<Object>() {
    
    
				@Override
				public Object getObject() throws BeansException {
    
    
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {
    
    
	//为当前的bean 填充属性,发现依赖等....解决循环依赖就是在这个地方
			populateBean(beanName, mbd, instanceWrapper);
			if (exposedObject != null) {
    
    
			//调用bean的后置处理器以及 initionalBean和自己自定义的方法进行初始化
				exposedObject = initializeBean(beanName, exposedObject, mbd);
			}
		}
		catch (Throwable ex) {
    
    
			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
    
    
				throw (BeanCreationException) ex;
			}
			else {
    
    
				throw new BeanCreationException(
						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
			}
		}

		if (earlySingletonExposure) {
    
    
		//去缓存中获取对象 只有bean 没有循环依赖 earlySingletonReference才会为空
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
    
    
			//检查当前的Bean 在初始化方法中没有被增强过(代理过)
				if (exposedObject == bean) {
    
    
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
    
    
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);
					for (String dependentBean : dependentBeans) {
    
    
						if (!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 " +
								"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
					}
				}
			}
		}

		// Register bean as disposable.
		try {
    
    
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {
    
    
			throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
    
    
		// Make sure bean class is actually resolved at this point.
		Class<?> beanClass = resolveBeanClass(mbd, beanName);

		if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
    
    
			throw new BeanCreationException(mbd.getResourceDescription(), beanName,
					"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
		}

		if (mbd.getFactoryMethodName() != null)  {
    
    
		///工厂方法不为空则使工厂方法初始化策略 也就是bean的配置过程中设置了factory-method方法
			return instantiateUsingFactoryMethod(beanName, mbd, args);
		}

		// Shortcut when re-creating the same bean...
		boolean resolved = false;
		boolean autowireNecessary = false;
		if (args == null) {
    
    
			synchronized (mbd.constructorArgumentLock) {
    
    
				if (mbd.resolvedConstructorOrFactoryMethod != null) {
    
    
					resolved = true;
					autowireNecessary = mbd.constructorArgumentsResolved;
				}
			}
		}
		if (resolved) {
    
    
			if (autowireNecessary) {
    
    
				return autowireConstructor(beanName, mbd, null, null);
			}
			else {
    
    
				return instantiateBean(beanName, mbd);
			}
		}

		// Need to determine the constructor...
		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		if (ctors != null ||
				mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
				mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
    
    
			return autowireConstructor(beanName, mbd, ctors, args);
		}

		// No special handling: simply use no-arg constructor.
		return instantiateBean(beanName, mbd);
	}

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingletonFactory 暴露对象解决循环依赖

//判断当前bean是否需要暴露到 缓存对象中
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));
		if (earlySingletonExposure) {
    
    
			if (logger.isDebugEnabled()) {
    
    
				logger.debug("Eagerly caching bean '" + beanName +
						"' to allow for resolving potential circular references");
			}
			//暴露早期对象到缓存中用于解决依赖的。
			addSingletonFactory(beanName, new ObjectFactory<Object>() {
    
    
				@Override
				public Object getObject() throws BeansException {
    
    
					return getEarlyBeanReference(beanName, mbd, bean);
				}
			});
		}

addSingletonFactory

//暴露早期对象到缓存中用于解决依赖的。
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    
    
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
    
    
			if (!this.singletonObjects.containsKey(beanName)) {
    
    
				this.singletonFactories.put(beanName, singletonFactory);
				this.earlySingletonObjects.remove(beanName);
				this.registeredSingletons.add(beanName);
			}
		}
	}

三、具体的方法在这里就不做详细的说明了,有兴趣的小伙伴可以自行研究,上面的getbean完整流程图和循环依赖图细细品味,相信你能获得很多东西。

猜你喜欢

转载自blog.csdn.net/mlplds/article/details/103022695