Spring bean 創建過程源碼解析

前言

在上一篇文件 Spring 中 bean 註冊的源碼解析 中分析了 Spring 中 bean 的註冊過程,就是把配置文件中配置的 bean 的信息加載到內存中,以 BeanDefinition 對象的形式存放,該對象中存放了 bean 的相關屬性,下面就以 debug 的形式一步步來看下 bean 是如何創建的。

Spring 中 bean 的創建可以說是非常的複雜,方法嵌套很多,爲了更好的理清創建過程,畫了下面的 UML 圖:

從上述 UML 圖中,可以看出 bean 的創建主要分爲以下幾步:

1. 根據 bean 的 name 解析對應的 class
2. 處理 lookup-metod 和 replace-method 子標籤
3. 處理初始化前的後置處理器
4. 真正的創建 bean 
    4.1 創建 bean 實例
        4.1.1 工廠方法創建
        4.1.2 帶參數的構造方法創建
        4.1.3 默認的構造方法創建
    4.2 
    4.3 添加單例對象的工廠緩存
    4.4 填充對象的各種屬性
        4.4.1 名稱注入
        4.4.2 類型注入
    4.5 處理 init-method 方法
        4.5.1 處理 bean 的前置處理器
        4.5.2 執行 init-method 方法
        4.5.3 處理 bean 的後置處理器

創建過程

創建 bean 的代碼是在 AbstractAutowireCapableBeanFactory 類中開始創建的,在分析的過程中,會把一些代碼省略掉,如異常處理等:

@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    // 表示 <bean> 標籤,裏面有各種屬性
	RootBeanDefinition mbdToUse = mbd;
    // 根據設置的 class 屬性或 className 來解析 class,
	Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
	if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
		mbdToUse = new RootBeanDefinition(mbd);
		mbdToUse.setBeanClass(resolvedClass);
	}
    // 處理 lookup-method 和 replace-method 子標籤
	mbdToUse.prepareMethodOverrides();
	
    // 給 BeanPostProcessors 機會返回一個代理來代替bean的實例
	// 即在初始化前,應用後置處理器,解析指定的bean是否存在初始化前的短路操作
	Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
	if (bean != null) {
		return bean;
	}	
    // 創建 bean 
	Object beanInstance = doCreateBean(beanName, mbdToUse, args);	
	return beanInstance;
}

處理 lookup-method 和 replace-method 子標籤

這兩個標籤雖然不常用,但是是很有用的,這裏不再細說;在 Spring 中 bean 註冊的源碼解析 中 這兩個標籤會被解析放到 BeanDefinition 對象的 methodOverrides 屬性中,表示需要覆蓋的方法;所以在創建bean之前需要解析這兩個標籤,但是隻是預處理:

public void prepareMethodOverrides() throws BeanDefinitionValidationException {
	// Check that lookup methods exists.
	MethodOverrides methodOverrides = getMethodOverrides();
	if (!methodOverrides.isEmpty()) {
		Set<MethodOverride> overrides = methodOverrides.getOverrides();
		synchronized (overrides) {
			for (MethodOverride mo : overrides) {
				prepareMethodOverride(mo);
			}
		}
	}
}
protected void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException {
    // 獲取對應類的方法的個數
	int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());
	if (count == 0) {
		throw new BeanDefinitionValidationException("...");
	}
    // 標記 MethodOverride 未被覆蓋,避免了後面參數類型檢查的開銷
	else if (count == 1) {
		mo.setOverloaded(false);
	}
}

在處理 prepareMethodOverride(MethodOverride mo) 方法爲什麼只處理方法個數爲 1 的情況呢?如果一個類中有多個重載的方法,則調用或增強的時候,還需要進行參數類型的解析才能確定調用的是哪個方法,Spring 把部分功能放在這裏提前進行預處理,如果方法只有一個,即沒有重載的方法,在後面調用的時候,直接找到該方法調用,不用再去解析參數來確定方法了,這樣就可以避免的一些參數類型檢查的開銷。

實例化的前置處理

如果經過前置處理後的結果不爲空,則直接返回,不再進行bean的創建過程,AOP功能就是在這裏判斷的:

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
	return bean;
}
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
	Object bean = null;
	if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			Class<?> targetType = determineTargetType(beanName, mbd);
			if (targetType != null) {
                // bean 的前置處理器
				bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
				if (bean != null) {
                    // bean 的後置處理器
					bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
				}
			}
		}
		mbd.beforeInstantiationResolved = (bean != null);
	}
	return bean;
}

創建 bean 

當經過 resolveBeforeInstantiation 方法後,如果程序創建了代理,或者執行了 applyBeanPostProcessorsBeforeInstantiation 和 applyBeanPostProcessorsAfterInitialization 方法後,bean 被改變了,則直接返回,否則,會進行創建bean操作:

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

	// 最終返回的 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) {
			// 應用 MergedBeanDefinitionPostProcessors
			applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
			mbd.postProcessed = true;
		}
	}
	// 檢查循環依賴:是否是單例 && 是否允許循環依賴 && 當前bean是否正在創建中
	boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
			isSingletonCurrentlyInCreation(beanName));
	if (earlySingletonExposure) {
		// 爲了避免後期的循環依賴,在bean初始化完成前,將創建bean的工廠添加到緩存中,如果其他的bean依賴該bean,直接從緩存中獲取對應的工廠創建集合,解決循環依賴,注意是隻有單例情況才能這麼做
		addSingletonFactory(beanName, new ObjectFactory<Object>() {
			public Object getObject() throws BeansException {
				return getEarlyBeanReference(beanName, mbd, bean);
			}
		});
	}
	// 初始化 bean
	Object exposedObject = bean;
    // 填充屬性
	populateBean(beanName, mbd, instanceWrapper);
	if (exposedObject != null) {
        // 執行初始化方法,如 init-method 
		exposedObject = initializeBean(beanName, exposedObject, mbd);
	}
	if (earlySingletonExposure) {
        // 只有在檢測到循環依賴時纔不會爲空
		Object earlySingletonReference = getSingleton(beanName, false);
        // 存在循環依賴
		if (earlySingletonReference != null) {
           // 如果 exposedObject 在初始化方法中沒有被改變,即沒有被增強
			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);
					}
				}
                // 因爲bean創建後,所依賴的bean一定是已經創建完畢的,actualDependentBeans 不爲空則表示所依賴的bean還沒有創建完,即存在循環依賴
				if (!actualDependentBeans.isEmpty()) {
					throw new BeanCurrentlyInCreationException("");
				}
			}
		}
	}
    // 根據 score 註冊 bean 
    registerDisposableBeanIfNecessary(beanName, bean, mbd);
	return exposedObject;
}

上面創建 bean 的過程很複雜,分爲很多步驟,下面再來看看這些步驟:

創建bean實例

創建 bean 的實例,會根據策略使用不同的創建方法,比如說 構造方法創建, 工廠方法創建,默認的構造方法創建等:

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
    // 獲取 bean 對應的 class 
	Class<?> beanClass = resolveBeanClass(mbd, beanName);
    // 如果工廠方法不爲空,則使用工廠方法創建
	if (mbd.getFactoryMethodName() != null)  {
		return instantiateUsingFactoryMethod(beanName, mbd, args);
	}
	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);
		}
	}
	// 解析構造方法
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	if (ctors != null ||
			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||
			mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {
        // 構造方法自動注入
		return autowireConstructor(beanName, mbd, ctors, args);
	}
    // 默認構造方法自動注入
	return instantiateBean(beanName, mbd);
}

參數的構造方法注入

先來看下帶參數的構造方法自動注入,

public BeanWrapper autowireConstructor(final String beanName, final RootBeanDefinition mbd,
		Constructor<?>[] chosenCtors, final Object[] explicitArgs) {

	BeanWrapperImpl bw = new BeanWrapperImpl();
	this.beanFactory.initBeanWrapper(bw);

	Constructor<?> constructorToUse = null;
	ArgumentsHolder argsHolderToUse = null;
	Object[] argsToUse = null;
    // explicitArgs 參數通過 getBean() 方法傳入,Object getBean(String name, Object... args)
	if (explicitArgs != null) {
        // 如果 getBean 方法傳入了參數,則直接使用
		argsToUse = explicitArgs;
	}
	else {
        // 如果 getBean 方法沒有傳入參數,則從配置文件進行解析
		Object[] argsToResolve = null;
        // 從緩存中獲取
		synchronized (mbd.constructorArgumentLock) {
			constructorToUse = (Constructor<?>) mbd.resolvedConstructorOrFactoryMethod;
			if (constructorToUse != null && mbd.constructorArgumentsResolved) {
				argsToUse = mbd.resolvedConstructorArguments;
				if (argsToUse == null) {
					argsToResolve = mbd.preparedConstructorArguments;
				}
			}
		}
		if (argsToResolve != null) {
            // 配置的構造方法參數
			argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve);
		}
	}
    // 該構造沒有被緩存,則需要進行解析
	if (constructorToUse == null) {
		boolean autowiring = (chosenCtors != null || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR);
		ConstructorArgumentValues resolvedValues = null;
        // 參數個數
		int minNrOfArgs;
		if (explicitArgs != null) {
			minNrOfArgs = explicitArgs.length;
		}
		else {
            // 獲取配置文件中配置的構造方法參數
			ConstructorArgumentValues cargs = mbd.getConstructorArgumentValues();
			resolvedValues = new ConstructorArgumentValues();
            // 獲取參數個數
		    minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
		}
		Constructor<?>[] candidates = chosenCtors;
		if (candidates == null) {
			Class<?> beanClass = mbd.getBeanClass();
			candidates = (mbd.isNonPublicAccessAllowed() ? beanClass.getDeclaredConstructors() : beanClass.getConstructors());
		}
        // 排序構造方法,按照參數個數進行排序
		AutowireUtils.sortConstructors(candidates);
		int minTypeDiffWeight = Integer.MAX_VALUE;
		Set<Constructor<?>> ambiguousConstructors = null;
		for (Constructor<?> candidate : candidates) {
			Class<?>[] paramTypes = candidate.getParameterTypes();
			if (constructorToUse != null && argsToUse.length > paramTypes.length) {
				// 如果已經找到滿足條件的構造方法,則終止
				break;
			}
			if (paramTypes.length < minNrOfArgs) {
				continue;
			}
			ArgumentsHolder argsHolder;
			if (resolvedValues != null) {
                // 構造方法參數的名字
				String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, paramTypes.length);
			    if (paramNames == null) {
                    // 如果參數名字爲空,則獲取參數名稱探索器
					ParameterNameDiscoverer pnd=this.beanFactory.getParameterNameDiscoverer();
					if (pnd != null) {
                        // 使用探索器獲取對應構造方法的參數名稱
					   paramNames = pnd.getParameterNames(candidate);
					}
                    // 根據參數名稱和類型創建參數持有者
				argsHolder = createArgumentArray(beanName, mbd, resolvedValues, bw, paramTypes, paramNames,getUserDeclaredConstructor(candidate), autowiring);
			}
			else {
				// 構造方法沒有參數
				argsHolder = new ArgumentsHolder(explicitArgs);
			}
            // 檢查是否有不確定性構造方法的存在,如參數爲父子關係
			int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
			if (typeDiffWeight < minTypeDiffWeight) {
				constructorToUse = candidate;
				argsHolderToUse = argsHolder;
				argsToUse = argsHolder.arguments;
				minTypeDiffWeight = typeDiffWeight;
				ambiguousConstructors = null;
			}
			else if (constructorToUse != null && typeDiffWeight == minTypeDiffWeight) {
				if (ambiguousConstructors == null) {
					ambiguousConstructors = new LinkedHashSet<Constructor<?>>();
					ambiguousConstructors.add(constructorToUse);
				}
				ambiguousConstructors.add(candidate);
			}
		}

		if (constructorToUse == null) {
			throw new BeanCreationException("...")
		}
        // 將解析的構造方法加入緩存
		if (explicitArgs == null) {
			argsHolderToUse.storeCache(mbd, constructorToUse);
		}
	}
    // 實例化
	Object beanInstance;
	if (System.getSecurityManager() != null) {
		final Constructor<?> ctorToUse = constructorToUse;
		final Object[] argumentsToUse = argsToUse;
		beanInstance = AccessController.doPrivileged(new PrivilegedAction<Object>() {
			public Object run() {
				return beanFactory.getInstantiationStrategy().instantiate(
						mbd, beanName, beanFactory, ctorToUse, argumentsToUse);
			}
		}, beanFactory.getAccessControlContext());
	}
	else {
		beanInstance = this.beanFactory.getInstantiationStrategy().instantiate(
				mbd, beanName, this.beanFactory, constructorToUse, argsToUse);
	}
	bw.setBeanInstance(beanInstance);
	return bw;
}

上面的方法就是使用構造方法進行實例化bean的過程,很複雜,也有很多的輔助方法,下面來看下實例化的過程:

實例化有兩種方式,CGLIB 和 反射:

beanFactory.getInstantiationStrategy().instantiate(mbd, beanName, beanFactory, ctorToUse);

先來看下 getInstantiationStrategy 方法返回什麼?

protected InstantiationStrategy getInstantiationStrategy() {
	return this.instantiationStrategy;
}
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();

它返回的是 InstantiationStrategy  接口,而接口由兩個實現類:

public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner,
		final Constructor<?> ctor, Object... args) {
    // 如果沒有需要動態改變的方法,則直接使用反射進行實例化
	if (bd.getMethodOverrides().isEmpty()) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged(new PrivilegedAction<Object>() {
				@Override
				public Object run() {
					ReflectionUtils.makeAccessible(ctor);
					return null;
				}
			});
		}
        // 使用 反射 實例化
		return BeanUtils.instantiateClass(ctor, args);
	}
	else {
        // 如果需要覆蓋或者動態替換的方法,則需要使用 CGLIB 來動態代理,在創建代理的時候,可以增強植入我們的代碼
		return instantiateWithMethodInjection(bd, beanName, owner, ctor, args);
	}
}

使用工廠方法創建實例和構造方法參不多,使用默認的構造方法實例化比較簡單,這裏就不列出來了。

屬性填充

在上面分析  doCreateBean 方法的時候,當通過 工廠方法,帶參數的構造方法或默認的構造方法創建了 bean 實例後,需要對 bean 的屬性進行設置

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
	PropertyValues pvs = mbd.getPropertyValues();
    // 給 InstantiationAwareBeanPostProcessor 最後一次機會在屬性設置前來改變 bean 
	boolean continueWithPropertyPopulation = true;
	if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                // postProcessAfterInstantiation 返回值爲是否繼續填充 bean 
				if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
					continueWithPropertyPopulation = false;
					break;
				}
			}
		}
	}
	if (!continueWithPropertyPopulation) {
		return;
	}

	if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
			mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
		MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        // 名稱注入
		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
			autowireByName(beanName, mbd, bw, newPvs);
		}
        // 類型注入
		if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
			autowireByType(beanName, mbd, bw, newPvs);
		}
		pvs = newPvs;
	}
    // 後處理器已經初始化
	boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    // 需要依賴檢查
	boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
	if (hasInstAwareBpps || needsDepCheck) {
		PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
		if (hasInstAwareBpps) {
		   for (BeanPostProcessor bp : getBeanPostProcessors()) {
			  if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                // 對所有需要依賴檢查的屬性進行後置處理
				pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(),beanName);
					if (pvs == null) {
						return;
					}
				}
			}
		}
		if (needsDepCheck) {
			checkDependencies(beanName, mbd, filteredPds, pvs);
		}
	}
    // 將屬性應用到 bean 中
	applyPropertyValues(beanName, mbd, bw, pvs);
}

關於 名稱 注入和類型注入,後面單獨分析

將屬性應用到 bean 中:

到這裏,已經完成了對注入屬性的獲取,但是獲取的是 PropereyValues 的形式存在,現在將他們應用到 bean 中去:

protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs) {
	if (pvs == null || pvs.isEmpty()) {
		return;
	}
	if (System.getSecurityManager() != null && bw instanceof BeanWrapperImpl) {
		((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
	}
	MutablePropertyValues mpvs = null;
	List<PropertyValue> original;
	if (pvs instanceof MutablePropertyValues) {
        // 如果 mpvs 中的值已經被轉換爲對應的類型,則可以直接設置到 beanWapper 中 
		mpvs = (MutablePropertyValues) pvs;
		if (mpvs.isConverted()) {
			bw.setPropertyValues(mpvs);
			return;
		}
		original = mpvs.getPropertyValueList();
	}
	else {
        // 如果 pvs 不是 MutablePropertyValues 封裝的類,則直接使用原始的屬性獲取方法
		original = Arrays.asList(pvs.getPropertyValues());
	}
    // 獲取用戶自定義的類型轉換器
	TypeConverter converter = getCustomTypeConverter();
	if (converter == null) {
		converter = bw;
	}
    / 獲取對應的解析器
	BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);

	List<PropertyValue> deepCopy = new ArrayList<PropertyValue>(original.size());
	boolean resolveNecessary = false;
    // 遍歷屬性,將屬性轉換爲對應類的對應屬性的類型
	for (PropertyValue pv : original) {
		if (pv.isConverted()) {
			deepCopy.add(pv);
		}
		else {
			String propertyName = pv.getName();
			Object originalValue = pv.getValue();
			Object resolvedValue = valueResolver.resolveValueIfNecessary(pv, originalValue);
			Object convertedValue = resolvedValue;
			boolean convertible = bw.isWritableProperty(propertyName) &&
					!PropertyAccessorUtils.isNestedOrIndexedProperty(propertyName);
			if (convertible) {
				convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
			}
			if (resolvedValue == originalValue) {
				if (convertible) {
					pv.setConvertedValue(convertedValue);
				}
				deepCopy.add(pv);
			}
			else if (convertible && originalValue instanceof TypedStringValue &&
				!((TypedStringValue) originalValue).isDynamic() &&
				!(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))) {
				pv.setConvertedValue(convertedValue);
				deepCopy.add(pv);
			}
			else {
				resolveNecessary = true;
				deepCopy.add(new PropertyValue(pv, convertedValue));
			}
		}
	}
	if (mpvs != null && !resolveNecessary) {
		mpvs.setConverted();
	}
	bw.setPropertyValues(new MutablePropertyValues(deepCopy));

}

執行初始化方法

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    // 執行用戶自定義的各種 aware 方法
	invokeAwareMethods(beanName, bean);

	Object wrappedBean = bean;
	if (mbd == null || !mbd.isSynthetic()) {
        // 在執行 init 方法之前,先執行 前置處理器 applyBeanPostProcessorsBeforeInitialization
		wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
	}
    // 執行初始化方法
	invokeInitMethods(beanName, wrappedBean, mbd);

    // 執行後置處理器 applyBeanPostProcessorsAfterInitialization
	if (mbd == null || !mbd.isSynthetic()) {
		wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
	}
	return wrappedBean;
}
// 執行用戶自定義的各種 aware 方法 
private void invokeAwareMethods(final String beanName, final Object bean) {
	if (bean instanceof Aware) {
		if (bean instanceof BeanNameAware) {
			((BeanNameAware) bean).setBeanName(beanName);
		}
		if (bean instanceof BeanClassLoaderAware) {
			((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
		}
		if (bean instanceof BeanFactoryAware) {
			((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
		}
	}
}

到這裏,bean 創建的大致過程就結束了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章