spring加载流程refresh之finishBeanFactoryInitialization(beanFactory)

前言:

经过前面的方法,最后终于到了最困难的方法finishBeanFactoryInitialization(),实例化所有的单例bean。


        

这个方法以下面两个类为基础进行解析。


public class X {
	@Autowired
	Y y;
}

class Y {
	@Autowired
	X x;
}

        

  1. 点开finishBeanFactoryInitialization()这个方法,我们看一看具体实现:
    protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    		
            ...		
    
    		//实例化对象
    		beanFactory.preInstantiateSingletons();
    
            ...
    
    }

    这个方法里我去掉了一些无关的代码,主要就是调用beanFactory.preInstantiateSingletons()实例化单例对象。接着往里看这个方法:位于:ConfigurableListableBeanFactory#preInstantiateSingletons();

        这是一个接口,我们需要看其实现类:DefaultListableBeanFactory#preInstantiateSingletons()。我们看看这个方法:

public void preInstantiateSingletons() throws BeansException {
		if (logger.isTraceEnabled()) {
			logger.trace("Pre-instantiating singletons in " + this);
		}

		// 1、从beanDefinitionNames获取所有的bean的名称
		List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

		// 遍历
		// 触发所有非延迟加载的单例bean的初始化
		for (String beanName : beanNames) {
			//合并父类的bd,在XML配置中配置的parent属性,这里也可以理解为就是beanDefinition。
			RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
			//如果当前bean----->不是抽象、是单例、不是懒加载
			if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
				//则判断bean是不是FactoryBean,一般情况下我们提供的bean都不是 FactoryBean
				if (isFactoryBean(beanName)) {
					Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
					if (bean instanceof FactoryBean) {
						final FactoryBean<?> factory = (FactoryBean<?>) bean;
						boolean isEagerInit;
						if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
							isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
											((SmartFactoryBean<?>) factory)::isEagerInit,
									getAccessControlContext());
						}
						else {
							isEagerInit = (factory instanceof SmartFactoryBean &&
									((SmartFactoryBean<?>) factory).isEagerInit());
						}
						if (isEagerInit) {
							getBean(beanName);
						}
					}
				}
				else {
					// 如果不是FactoryBean
					getBean(beanName);
				}
			}
		}

		// Trigger post-initialization callback for all applicable beans...
		// 为所有适用的 bean 触发初始化回调
		for (String beanName : beanNames) {
			Object singletonInstance = getSingleton(beanName);
			if (singletonInstance instanceof SmartInitializingSingleton) {
				final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
				if (System.getSecurityManager() != null) {
					AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
						smartSingleton.afterSingletonsInstantiated();
						return null;
					}, getAccessControlContext());
				}
				else {
					smartSingleton.afterSingletonsInstantiated();
				}
			}
		}
	}

讲道理,我们一般情况不会提供FactoryBean,所以直接看getBean();

AbstractBeanFactory#getBean(java.lang.String)

接着点开doGetBean();doGetBean这个方法比较复杂,在这个方法里完成了实例化、初始化、属性填充,等工作。方法调用到这里我画一下调用流程:

 我们看一看doGetBean()这个方法:

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

		//1-1  去掉名称的&符号
		final String beanName = transformedBeanName(name);
		Object bean;

		// Eagerly check singleton cache for manually registered singletons.
		// 这里是在创建bean的时候去容器中获取bean,在大部分情况下都是获取不到的因为正在创建
		// 为了处理lazy的bean,防止lazy的bean在之前创建过了
        // 1-2
		Object sharedInstance = getSingleton(beanName);
		// sharedInstance这个对象99%的都是null,除非是特殊对象,或者是Sring 内置对象
		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.
			// 判断当前创建的类是否是原型(prototype),基本上不会发生,因为在前面已经有方法判断isSingleton了
			if (isPrototypeCurrentlyInCreation(beanName)) {
				throw new BeanCurrentlyInCreationException(beanName);
			}

			try {
				final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
				checkMergedBeanDefinition(mbd, beanName, args);
				// 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;
			}
		}

		return (T) bean;
	}

在这个方法里,我删除了一些代码,我们只分析重要代码。

第一步:我们先看

final String beanName = transformedBeanName(name);

当我们传的name=X的时候,在这个方法里会判断这个name是不是以&开头的,因为这个bean可能是一个FactoryBean类型的,如果是FactoryBean则去掉&符,获取真正的beanName。

第二步:getSingleton(beanName);

在上面这个代码里,我们首先从singletonObjects单例缓存池中获取beanName。

Object singletonObject = this.singletonObjects.get(beanName);

为什么刚要创建bean就要从singletonObjects单例缓存池中获取?

那是因为Spring怕你要创建的bean是已经创建好的bean,如果是已经创建完成的bean就会放到这个缓存池,直接获取就好了(这个bean已经实例化完成,别的bean引入了这个bean会有这种情况)。此时由于我们是第一次调用,所以:singletonObject 肯定为null。

if语句的这个判断:isSingletonCurrentlyInCreation(beanName)
判断要创建的这个bean在不在当前正在创建的集合当中。这里肯定不存在,毕竟刚调用过来,什么事都还没做啊!

所以说:下面这个判断整体为false不会进,直接返回null。

if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
   
}

我们来看这个else语句,删除了一些无关代码,结构如下:

在这里首先通过beanName获取对应的RootBeanDefinition。

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

 判断当前bean是否为单例的,这里我们的对象是X肯定符合所以进这个判断

                //创建
				if (mbd.isSingleton()) {
					sharedInstance = getSingleton(beanName, () -> {
						try {
							//被回调,创建对象,应用后置处理器
							return createBean(beanName, mbd, args);
						}
						catch (BeansException ex) {
							
							destroySingleton(beanName);
							throw ex;
						}
					});
					bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
				}

 我们看这个If语句里面的内容,第二次调用getSingleton(); 如果有印象的话上面也调用了一次getSingleton,这是方法重载,两个getSingleton方法并不是同一个方法,看参数就知道了,为了区别这里我称为第二次调用getSingleton;这里使用的是lamda表达式,在这一次的getSingleton就会把我们的bean创建出来。我们先来看代码吧:

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
		Assert.notNull(beanName, "Bean name must not be null");
		//singletonObjects是IOC的容器
		// 这个创建过程是加锁的
		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 + "'");
				}
				//把beanName添加到正在创建的集合中,表示正在创建。创建完成后移除,在下面的代码中
				beforeSingletonCreation(beanName);
				boolean newSingleton = false;
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<>();
				}
				try {
					//创建对象,应用后置处理,上一个方法的lambda表达式
					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;
		}
	}
Object singletonObject = this.singletonObjects.get(beanName);

第二次调用getSingleton上来就调用了this.singletonObjects.get(beanName);直接从单例缓存池中获取这个对象,由于这里是创建一定返回null;接着看下面的代码:

//把beanName添加到正在创建的集合中,表示正在创建。创建完成后移除,在下面的代码中
beforeSingletonCreation(beanName);

 而后调用了beforeSingletonCreation()方法,此方法就把当前要创建的对象存放到正在创建的集合当中,也就是:singletonsCurrentlyInCreation。应该还记得吧,在第一次调用getSingleton的时候再if语句中就判断了bean是否在正在singletonsCurrentlyInCreation当中,那个时候返回的是null,程序运行到这里才将bean存入singletonsCurrentlyInCreation集合中。

Set<String> singletonsCurrentlyInCreation 

这是一个set集合,用于缓存正在创建的集合,在第二次调用getSingleton中被添加,当对象创建完成之后会从此集合中移除。

 我们继续向下看代码:

 这里singletonFactory.getObject();调用的就是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.
		// lookup-method 和 replace-method ,spring将这两种配置统称为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.
			//给BeanPostProcessor一个机会来返回代理而不是目标bean实例。
			// 就是:InstantiationAwareBeanPostProcessors这个后置处理器,如果返回的是一个对象,
			// 则不继续正常流程创建对象
			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 {
			//创建bean
			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。我们先看第一件事:

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

                    |
                    |
                    V
在这个方法起去判断这个bean有没有实现 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;
}

                    |
                    |
                    v
如果有实现InstantiationAwareBeanPostProcessor这个后置处理器,则会调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()方法

protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
				if (result != null) {
					return result;
				}
			}
		}
		return null;
	}

我们一般不会去实现InstantiationAwareBeanPostProcessor,对这个后置处理器不了解的可以看我这个篇文章 。而本次探讨的X类是没有的。我们继续往下看:

        try {
			//创建bean
			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
			if (logger.isTraceEnabled()) {
				logger.trace("Finished creating instance of bean '" + beanName + "'");
			}
			return beanInstance;
		}

 掉用了doCreateBean();下面是代码

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.
		// bd是一个单例 且 允许循环引用 且 当前bean为正在创建状态(正在创建状态在getSingleton方法中设置的)
		// 则允许暴露早期单例
		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;
	}

 第一步:

instanceWrapper = createBeanInstance(beanName, mbd, args);

 createBeanInstance 顾名思义,就是创建一个实例对象。这个createBeanInstance方法是如何把对象创建出来的呢? 就是利用构造方法反射实例化对象;那么构造方法是如何推断出来的呢?这个问题我不准备在此分析,因为Spring推断构造方式是源码中特别重要,特别难的一块,后面我会单独出一篇博客来分析。到此X对象就被创建出来了。我们接着往下看:

// bd是一个单例 且 允许循环引用 且 当前bean为正在创建状态(正在创建状态在getSingleton方法中设置的)
// 则允许暴露早期单例
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
				isSingletonCurrentlyInCreation(beanName));

这段代码就比较简单了,就是判断是否开启了循环依赖,如果返回true则Spring会做一些特殊的处理来完成循环依赖;

  1.  mbd.isSingleton() 判断当前实例化的bean是否为单例;这里说明原型是不支持循环依赖的;因为如果是原型的这里就会返回false,这里环境是X默认是单例的,所以为true。
  2. this.allowCircularReferences 整个全局变量Spring默认为true,但是Spring提供了API可以修改此变量。在没有修改的情况下这里返回true。
  3. isSingletonCurrentlyInCreation(beanName)判断当前正在创建的bean是否处于正在创建的集合中,这里肯定为true。
    这里三个判断都是true,结果为true。既然earlySingletonExposure 结果为true则Spring做一个特殊处理。我们看源码:
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));
		}

我们看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);
			}
		}
	}

上述代码的意思是:

如果singletonObjects这个单例缓存池(也叫一级缓存)中不存在,则会把工厂对象put到

singletonFactories这个三级缓存中,再将二级缓存中的数据清除。
singletonObjects 一级缓存单例池 ,主要存放单例bean
earlySingletonObjects 二级缓存,主要存放半成品的bean(实例化之后属性填充之前的bean)
singletonFactories 三级缓存,主要存放的是ObjectFactory类型的工厂对象

如果开启了循环依赖,Spring会将singletonFactory add 到三级缓存中,为什么要add到三级缓存的这个map中?主要是为了循环依赖,提前暴露这个工厂。

接下来看populateBean(beanName, mbd, instanceWrapper);

populateBean主要完成完成属性注入,也就是大家尝尝说的自动注入;

这里的代码又是比较复杂,我这里简单说一下:

属性填充:

会先判断自动注入模型,根据注入模型注入属性,拿到要注入的bean,调用getBean(y),getBean的本质上面已经说过了,然后调用第一次的getSingleton方法,在这里首先会从单例缓存池中获取一下y,如果没有,则判断当前要创建的bean是不是处理正在创建的集合当中,如果也不存在则开始创建y,剩下的流程就跟创建x是一样的了,当开始填充Y 类的X属性时,会去getBean(x),此时再一次走到getSingleton(x),这一次获取也是null,但是当判断是否处于正在创建的集合当中时,返回true,判断成立,则会从三级缓存中获取x的实例,并将x添加到二级缓存中,移除三级缓存中的实例,使缓存升级,到此getBean(x)的属性就结束了。Y类的属性就填充完了。而X类中的y属性也就可以获取到了,属性填充结束,不管是循环依赖还是正常的属性填充都到此结束。

initializeBean(beanName, exposedObject, mbd);

initializeBean 方法里主要完成了以下操作:

1、回调Aware相关的接口(BeanNameAware/BeanClassLoaderAware/BeanFactoryAware)

2、调用BeanPostProcessor#postProcessBeforeInitialization 

3、invokeInitMethods @PostConstruct或 实现 InitializingBean 的方法

4、回调BeanPostProcessor#postProcessAfterInitialization()

 bean实例创建完成之后返回DefaultSingletonBeanRegistry#getSingleton()

返回singletonObject实例对象,接着往下走:

 

 将实例化好的beanName从正在创建的集合当中移除

最后,bean添加到一级缓存,移除二级缓存与三级缓存.至此我们整个方法都结束了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小tu豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值