【Spring容器getBean流程】


前言

Spring是管理Bean的容器,Spring容器初始化的时候注册了BeanDefinition,getBean通过容器中的BeanDefinition来生成对应实例,我们简单了解下getBean的流程


一、BeanFactory

getBean方法定义在BeanFactory接口里面,有根据bean的name查找,也有根据Class类型查找

Object getBean(String name)   
<T> T getBean(Class<T> requiredType)

我们看下根据bean的name查询创建实例的流程

二、AbstractBeanFactory

1.doGetBean

getBean首先调用进入到AbstractBeanFactory doGetBean方法里面

	protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
			@Nullable final 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)) {
				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 (parentBeanFactory instanceof AbstractBeanFactory) {
					return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
							nameToLookup, requiredType, args, typeCheckOnly);
				}
				else if (args != null) {
					// Delegation to parent with explicit args.
					return (T) parentBeanFactory.getBean(nameToLookup, args);
				}
				else if (requiredType != null) {
					// No args -> delegate to standard getBean method.
					return parentBeanFactory.getBean(nameToLookup, requiredType);
				}
				else {
					return (T) parentBeanFactory.getBean(nameToLookup);
				}
			}

			/**
			 * 获取FactoryBean 时是true
			 */
			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.
				if (mbd.isSingleton()) {	
					sharedInstance = getSingleton(beanName, () -> {
						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);
				}

				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, () -> {
							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 && !requiredType.isInstance(bean)) {
			try {
				T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
				if (convertedBean == null) {
					throw new BeanNotOfRequiredTypeException(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);
				}
				throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
			}
		}
		return (T) bean;
	}

内容比较多,主要流程是这样的
在这里插入图片描述

  1. 转换一下Bean的name
    doGetBean方法第4行调用了transformedBeanName,为啥getBean过程中先要有这一步操作呢,我们想想如果你传的是Bean 的别名呢
  2. getSingleton 获取单例bean实例
    这个方法调用了DefaultSingletonBeanRegistry类获取实例的方法
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		/**
		 * bean创建过程中 会打上singletonsCurrentlyInCreation标记
		 * 三级缓存 解决 AOP对象可能被代理
		 */
		if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					// 装配早期 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean)); 没有填充属性
					ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
					if (singletonFactory != null) {

						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return singletonObject;
	}

getSingleton整体流程是这样的从几个缓存对象里面获取对象
在这里插入图片描述

  • getSingleton第2行代码从singletonObjects中获取对象实例,这个是存Bean的完整实例,在Bean创建后期所有流程都走完,bean的属性也填充好之后调用addSingleton方法将Bean的完整实例存入singletonObjects中,或者直接调用registerSingleton注册一个单例对象,总之singletonObjects这里存的就是一个完整的Bean实例(该有的功能属性都有了)
  • 第7行如果完整实例不存在,则尝试从其它缓存实例中拿到对象,当中的isSingletonCurrentlyInCreation什么意思呢,这里正在创建的单例bean都会打上这个标记(在 Object getSingleton(String beanName, ObjectFactory<?> singletonFactory)方法里面),创建完Bean实例后再清楚这个标记
  • allowEarlyReference这个值的属性我们在按Bean的name获取bean时默认是true,也就是要get的单例bean正在创建的话会走到if里面的流程,去尝试从earlySingletonObjects中获取早期保留的bean实例(这时候拿到的bean没有完整的属性,因为bean实例没有完全创建好,不过这没关系,Bean实例的地址没错就对了),开始earlySingletonObjects这个对象也是拿不到对象的因为要在16行才能给这个早期bean实例map塞值进去
  • 解析来再看看singletonFactories,这个是在AbstractAutowireCapableBeanFactory创建bean实例的doCreateBean方法里面赋值的,在这之后还有填充Bean实例属性(populateBean),调用Aware适配器接口(invokeAwareMethods),初始化逻辑(invokeInitMethods),虽然Bean实例还没完全创建完成(只是Bean实例的属性未填充),但先可以暴露出去(不用等到Bean实例完全创建好其它Bean才能引用,这样可以节省其它bean创建所需的事件)
  1. 获取Bean实例后有两个分支,我们先来看看Bean实例不为空并且getBean未传入除bean的name以外其它参数的情况
    这里调用了getObjectForBeanInstance方法,注意下后面的流程也有可能调用到这个方法,这里调用的时候第4个参数传的是null,这个方法里面如果是对应的bean是FactoryBean 则调用getObject方法拿到实例对象

  2. 接下来是Bean实例不存在,或者getBean传递了其它参数的情况,第一次getBean的时候Bean实例一般是不存在的我们看看后面else里面的逻辑
    doGetBean 第27至29行检测了Bean是否正在创建,单例bean创建不涉及
    第32至51行 如果当前容器不存在Bean,父容器存在的话到父容器去getBean如果能拿到Bean实例直接返回了
    第56至58行标记一个状态,获取工厂beantypeCheckOnly传的是true,一般Bean是否false,markBeanAsCreated方法里面主要是标记作用,
    如果mergedBeanDefinitions不包含当前BeanDefinition ,bean的stale属性设为true,alreadyCreated添加正在创建的bean定义
    第61行getMergedLocalBeanDefinition处理合并Bean定义,mergedBeanDefinitions开始是没有值的所以第一个getBean进入的是getMergedBeanDefinition分支,这里面如果Bean有parentName属性的话就会合并

protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
		RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
		if (mbd != null && !mbd.stale) {
			return mbd;
		}
		return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
	}

第65至81行如果有依赖的Bean的话,将Bean直接的依赖关系记录到DefaultSingletonBeanRegistry并且先实例化对应Bean
DefaultSingletonBeanRegistry 有dependentBeanMap dependenciesForBeanMap两个Map记录依赖关系,
dependentBeanMap 记录的是Key值代表的Bean被其他多少bean依赖,dependenciesForBeanMap记录的是Key值代表的Bean依赖其它多少Bean

接下来就是创建Bean的流程,我们直接看下84至96行创建单例bean的逻辑,还是先调用getSingleton获取完整Bean的实例(else逻辑分支里面有一种请求就是前面已经获取到了实例但是getBean还带了其它参数),如果没有实例就调用createBean方法创建,

if (mbd.isSingleton()) {
					/**
					 * DefaultSingletonBeanRegistry getBean 调用这里的Lambda函数创建bean实例
					 */
					sharedInstance = getSingleton(beanName, () -> {
						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);
				}

正常情况下第一次getBean的情况下都会走到createBean的逻辑里面,在这个里面创建实例,在Bean实例创建完成后调用addSingleton方法
将创建好的实例添加到DefaultSingletonBeanRegistry缓存中,跟踪代码我们发现这里的createBean交给了AbstractAutowireCapableBeanFactory实现

三 AbstractAutowireCapableBeanFactory createBean流程

	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
			throws BeanCreationException {

		if (logger.isTraceEnabled()) {
			logger.trace("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.
			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);
		}

		try {
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}
		catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
			// A previously detected exception with proper bean creation context already,
			// or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
			throw ex;
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
		}
	}

根据Bean定义来创建bean的实例

  1. 第7行重新定义了一个RootBeanDefinition 来作为后续创建bean的参数(创建bean过程中可能可能重新设置Bean的beanClass属性)
  2. 第12至16行resolveBeanClass解析原来Bean定义里的beanClass,这个字段属性值有可能是字符串,SpringEL表达式,当然也可能直接就是Class实例,如果不是Class实例就要进入if条件里面重新设置解析后的beanClass
  3. 第20行处理 lookup-method 和 replace-method 配置,这两个配置spring会解析成bean的methodOverrides属性
  4. 解下来第29行 resolveBeforeInstantiation,看字幕意思Instantiation之前resolve,这里给了个几乎让容器中实现了InstantiationAwareBeanPostProcessor接口的后处理器实现来扩展
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
			// Make sure bean class is actually resolved at this point.
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					if (bean != null) {
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				}
			}
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}
  • resolveBeforeInstantiation 方法第4行这个if条件第一次getBean的时候默认是null,条件满足,第6行两个条件synthetic默认是false,Spring容器中显然有这个后处理器,所有这个条件也是能进来的
  • 第7行拿到准备交给后处理器扩展的类,对于这个determineTargetType跟踪源码可以看到,会先尝试获取BeanDefinition的resolvedTargetType(默认是没值,解析后就可能赋值),targetType泛型类获取target类,都没有的话从工厂方法获取target类,最后才是前面提到的resolveBeanClass拿到BeanDefinition的beanClass(一般情况下注册的bean这个属性都是Class实例)
	protected Class<?> determineTargetType(String beanName, RootBeanDefinition mbd, Class<?>... typesToMatch) {
		Class<?> targetType = mbd.getTargetType();
		if (targetType == null) {
			targetType = (mbd.getFactoryMethodName() != null ?
					getTypeForFactoryMethod(beanName, mbd, typesToMatch) :
					resolveBeanClass(mbd, beanName, typesToMatch));
			if (ObjectUtils.isEmpty(typesToMatch) || getTempClassLoader() == null) {
				mbd.resolvedTargetType = targetType;
			}
		}
		return targetType;
	}
	
	public Class<?> getTargetType() {
		if (this.resolvedTargetType != null) {
			return this.resolvedTargetType;
		}
		ResolvableType targetType = this.targetType;
		return (targetType != null ? targetType.resolve() : null);
	}
  • 然后调用容器中实现了InstantiationAwareBeanPostProcessor接口的bean后处理applyBeanPostProcessorsBeforeInstantiation方法(接口默认方法是返回null)来增强前面拿到的bean解析的类
容器中重写了postProcessBeforeInstantiation方法的后处理器postProcessBeforeInstantiation方法返回
AbstractAutoProxyCreator会生成AOP代理类
CommonAnnotationBeanPostProcessor返回null
PersistenceAnnotationBeanPostProcessor返回null
ScriptFactoryPostProcessor被代理的类是ScriptFactory子类返回不为null
  • 经过applyBeanPostProcessorsBeforeInstantiation增强处理后返回不为null后再调用Bean后处理的postProcessAfterInitialization方法(这个是BeanPostProcessor定义的方法所有Bean后处理都会继承这个接口)
  1. 上一步提到的resolveBeforeInstantiation 针对于aop场景下代理的类可能就直接交由对应Bean后处理器创建代理类返回了,其它情况还是要继续doCreateBean创建Bean实例
	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) {
			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) {
					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.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 {
			populateBean(beanName, mbd, instanceWrapper);
			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) {
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {
				if (exposedObject == bean) {
					exposedObject = earlySingletonReference;
				}
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
					String[] dependentBeans = getDependentBeans(beanName);
					Set<String> actualDependentBeans = new LinkedHashSet<>(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;
	}

doCreateBean流程分析

  • 第5到11行拿到一个BeanWrapper ,没有就创建
  • 第12到16行拿到BeanWrapper包装的wrappedObject 和对应Class并设置到Bean定义的resolvedTargetType属性
  • 第19到30行 容器中实现了MergedBeanDefinitionPostProcessor接口的Bean后处理器postProcessMergedBeanDefinition方法对前面的resolvedTargetType增强处理,这里注意是通过后处理器处理spring中的一些注解注入
    在这里插入图片描述
    • 第34到41行暴露一个Bean实例的早期对象到DefaultSingletonBeanRegistry(要满足创建的Bean是单例bean,允许循环依赖,bean正在创建三个条件)
    • 第45到58行填充Bea的实例并初始化
    • 第60到85行
    • 第89行 注册一个DisposableBeanAdapter 到DefaultSingletonBeanRegistrydisposableBeanskey是当前创建Bean的name来管理bean的销毁,销毁bean destroySingleton方法调用了DisposableBean的destory方法
  1. 返回创建好的实例

createBeanInstance

前面有提到这个方法,这里创建了一个BeanWrapper包装bean的实例

	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable 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());
		}

		Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
		if (instanceSupplier != null) {
			return obtainFromSupplier(instanceSupplier, beanName);
		}
		if (mbd.getFactoryMethodName() != null) {
			return instantiateUsingFactoryMethod(beanName, mbd, args);
		}

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

		// Candidate constructors for autowiring?
		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
				mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
			return autowireConstructor(beanName, mbd, ctors, args);
		}

		// Preferred constructors for default construction?
		ctors = mbd.getPreferredConstructors();
		if (ctors != null) {
			return autowireConstructor(beanName, mbd, ctors, null);
		}

		// No special handling: simply use no-arg constructor.
		return instantiateBean(beanName, mbd);
	}
  • createBeanInstance第10到13行通过Bean的Supplier接口创建实例
  • 第14到16行通过工厂方法来创建bean实例
    工厂方法创建Bean实例的代码实例
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
      ">
     <!--配置静态工厂创建Car对象-->
     <bean id="bean1" class="com.dlh.spring.StaticFactory" factory-method="getBean">
     </bean>
     <bean id="instanceFactory" class="com.dlh.spring.InstanceFactory"></bean>
     <!--通过实例工厂对象创建car对象-->
     <bean id="bean2" factory-bean="instanceFactory" factory-method="getBean" >
     </bean>

     <bean id="demo" class="com.dlh.spring.StructureDemo">
          <constructor-arg ref="bean1"> </constructor-arg>
     </bean>
</beans>
public class StaticFactory {
    public static Bean getBean(){
        Bean bean = new Bean();
        bean.setDesc("这个是由静态工厂创建");
        return bean;
    }
}

public class InstanceFactory {
    public InstanceFactory() {
    }
    public  Bean getBean(){
        Bean bean = new Bean();
        bean.setDesc("这个是由实例工厂创建");
        return bean;
    }
}

  • 如果也没有指定工厂方法的话,那就老老实实根据构造函数来创建Bean实例了,后面都是根据构造函数来创建Bean实例的逻辑
    对应getBean入参不为空的情况
    代码从第42行开始执行先获取Bean后处理器扩展的构造函数
    第43行的条件如果getBean有入参,或者BeanDefinition的constructorArgumentValues属性有值都会调用autowireConstructor
    第49行对应RootBeanDefinition拿到的构造函数是null
    55行就是就用无参构造函数来创建实例了

第32至39行 resolved条件依然是false


总结

本文简单总结了下Spring容器getBean的流程,具体根据工厂方法,构造函数创建bean,Bean属性填充的流程还得细看下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值