SpringIoC源碼:createBean(下)-創(chuàng)新互聯(lián)

文章目錄
  • Spring源碼系列:
    • 前言
    • 正文
    • 方法1:initializeBean
    • 方法2:invokeAwareMethods
    • 方法3:applyBeanPostProcessorsBeforeInitialization
    • 方法4:invokeInitMethods
    • 方法5:invokeCustomInitMethod
    • 方法6:applyBeanPostProcessorsAfterInitialization
    • 方法7:registerDisposableBeanIfNecessary
    • 方法8:requiresDestruction
    • 方法9:hasDestroyMethod
    • 方法10:hasApplicableProcessors
    • 總結(jié)

成都創(chuàng)新互聯(lián)公司2013年至今,先為扶綏等服務(wù)建站,扶綏等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為扶綏企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。Spring源碼系列:

Spring IOC源碼:簡(jiǎn)單易懂的Spring IOC 思路介紹
Spring IOC源碼:核心流程介紹
Spring IOC源碼:ApplicationContext刷新前準(zhǔn)備工作
Spring IOC源碼:obtainFreshBeanFactory 詳解(上)
Spring IOC源碼:obtainFreshBeanFactory 詳解(中)
Spring IOC源碼:obtainFreshBeanFactory 詳解(下)
Spring IOC源碼:<context:component-scan>源碼詳解
Spring IOC源碼:invokeBeanFactoryPostProcessors 后置處理器詳解
Spring IOC源碼:registerBeanPostProcessors 詳解
Spring IOC源碼:實(shí)例化前的準(zhǔn)備工作
Spring IOC源碼:finishBeanFactoryInitialization詳解
Spring IoC源碼:getBean 詳解
Spring IoC源碼:createBean( 上)
Spring IoC源碼:createBean( 中)
Spring IoC源碼:createBean( 下)
Spring IoC源碼:finishRefresh 完成刷新詳解

前言

上篇文章講解了實(shí)例化后,初始化屬性注入過(guò)程中屬性值的解析過(guò)程及其注入過(guò)程,本篇繼續(xù)講解doCreateBean流程中屬性注入后的其它流程,即對(duì)bean實(shí)例進(jìn)行初始化。

正文

populateBean方法執(zhí)行完成后,開(kāi)始初始化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()) {//如果是單例并且是FactoryBean則嘗試移除
			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
		}
		if (instanceWrapper == null) {	//創(chuàng)建Bean實(shí)例,通過(guò)策略進(jìn)行創(chuàng)建,如果選擇有參構(gòu)造或無(wú)參構(gòu)造
			instanceWrapper = createBeanInstance(beanName, mbd, args);
		}
		//獲取當(dāng)前實(shí)例對(duì)象
		final Object bean = instanceWrapper.getWrappedInstance();
		//當(dāng)前實(shí)例的Calss對(duì)象
		ClassbeanType = instanceWrapper.getWrappedClass();
		if (beanType != NullBean.class) {	//設(shè)置當(dāng)前bean定義信息的目標(biāo)類型
			mbd.resolvedTargetType = beanType;
		}

		// Allow post-processors to modify the merged bean definition.
		synchronized (mbd.postProcessingLock) {	if (!mbd.postProcessed) {		try {//執(zhí)行MergedBeanDefinitionPostProcessor類型后置處理器的postProcessMergedBeanDefinition方法,
					//如@Autowire注解,就是通過(guò)該后置處理器進(jìn)行解析
					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.
		//如果是單例,允許循環(huán)依賴,并且beanName正在創(chuàng)建中
		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");
			}
			//包裝成FactoryObject對(duì)象,并添加到三級(jí)緩存中
			addSingletonFactory(beanName, () ->getEarlyBeanReference(beanName, mbd, bean));
		}

		// Initialize the bean instance.
		Object exposedObject = bean;
		try {	//初始化過(guò)程,進(jìn)行屬性注入。該過(guò)程遞歸創(chuàng)建其依賴的屬性。如果A中有B,B中有C,則創(chuàng)建B跟C。
			populateBean(beanName, mbd, instanceWrapper);
			//該過(guò)程執(zhí)行后置處理器的before方法,bean的init方法,后置處理器的after方法,可能會(huì)生成新的bean對(duì)象
			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) {	//從緩存中獲取,因?yàn)樯厦嫖覀儗⑵涮砑拥饺?jí)緩存中,從三級(jí)緩存中獲取會(huì)調(diào)用FactoryObject對(duì)象的getObject方法,可能會(huì)觸發(fā)AOP代理。返回代理對(duì)象
			Object earlySingletonReference = getSingleton(beanName, false);
			if (earlySingletonReference != null) {		//如果bean對(duì)象還是原來(lái)的,則將三級(jí)緩存中獲取的對(duì)象賦值過(guò)去
				if (exposedObject == bean) {exposedObject = earlySingletonReference;
				}
				//如果exposedObject在initializeBean方法中被增強(qiáng) && 不允許在循環(huán)引用的情況下使用注入原始bean實(shí)例
				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {//	獲取依賴當(dāng)前beanName的所有bean名稱
					String[] dependentBeans = getDependentBeans(beanName);
					SetactualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
					//嘗試移除這些bean的實(shí)例,因?yàn)檫@些bean依賴的bean已經(jīng)被增強(qiáng)了,他們依賴的bean相當(dāng)于臟數(shù)據(jù)
					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 {	//注冊(cè)用于銷毀的bean,執(zhí)行銷毀操作的有三種:自定義destroy方法、DisposableBean接口、DestructionAwareBeanPostProcessor
			registerDisposableBeanIfNecessary(beanName, bean, mbd);
		}
		catch (BeanDefinitionValidationException ex) {	throw new BeanCreationException(
					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
		}

		return exposedObject;
	}

initializeBean(beanName, exposedObject, mbd),見(jiàn)方法1詳解

registerDisposableBeanIfNecessary(beanName, bean, mbd),見(jiàn)方法7詳解

方法1:initializeBean
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {	AccessController.doPrivileged((PrivilegedAction) () ->{		invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {	//對(duì)bean的aware屬性進(jìn)行填充
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		//執(zhí)行BeanPostProcessors的postProcessBeforeInitialization方法,可能會(huì)返回新的對(duì)象值
		if (mbd == null || !mbd.isSynthetic()) {	wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {	//調(diào)用初始化方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {	throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {	//執(zhí)行BeanPostProcessors的postProcessAfterInitialization方法,AOP代理就是在這個(gè)步驟進(jìn)行處理的
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}

invokeAwareMethods(beanName, bean),見(jiàn)方法2詳解

applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName),見(jiàn)方法3詳解

invokeInitMethods(beanName, wrappedBean, mbd),見(jiàn)方法4詳解

applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName),見(jiàn)方法6詳解

方法2:invokeAwareMethods
private void invokeAwareMethods(final String beanName, final Object bean) {//如果實(shí)現(xiàn)了Aware接口,根據(jù)實(shí)現(xiàn)不同接口,對(duì)屬性進(jìn)行填充
		if (bean instanceof Aware) {	//填充beanName值
			if (bean instanceof BeanNameAware) {		((BeanNameAware) bean).setBeanName(beanName);
			}
			if (bean instanceof BeanClassLoaderAware) {		//填充ClassLoader 
				ClassLoader bcl = getBeanClassLoader();
				if (bcl != null) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
				}
			}
			if (bean instanceof BeanFactoryAware) {		//填充當(dāng)前beanFactory工廠
				((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
			}
		}
	}
方法3:applyBeanPostProcessorsBeforeInitialization
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {Object result = existingBean;
		//執(zhí)行BeanPostProcessors的postProcessBeforeInitialization方法,可能會(huì)返回新的對(duì)象值。
		for (BeanPostProcessor processor : getBeanPostProcessors()) {	Object current = processor.postProcessBeforeInitialization(result, beanName);
			if (current == null) {		return result;
			}
			result = current;
		}
		return result;
	}
方法4:invokeInitMethods
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
			throws Throwable {//判斷是否實(shí)現(xiàn)了InitializingBean接口,如果是則調(diào)用afterPropertiesSet方法
		boolean isInitializingBean = (bean instanceof InitializingBean);
		if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {	if (logger.isTraceEnabled()) {		logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
			}
			if (System.getSecurityManager() != null) {		try {AccessController.doPrivileged((PrivilegedExceptionAction) () ->{((InitializingBean) bean).afterPropertiesSet();
						return null;
					}, getAccessControlContext());
				}
				catch (PrivilegedActionException pae) {throw pae.getException();
				}
			}
			else {		((InitializingBean) bean).afterPropertiesSet();
			}
		}
		//調(diào)用自定義初始化方法
		if (mbd != null && bean.getClass() != NullBean.class) {	String initMethodName = mbd.getInitMethodName();
			if (StringUtils.hasLength(initMethodName) &&
					!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
					!mbd.isExternallyManagedInitMethod(initMethodName)) {		invokeCustomInitMethod(beanName, bean, mbd);
			}
		}
	}

invokeCustomInitMethod(beanName, bean, mbd),見(jiàn)方法5詳解

方法5:invokeCustomInitMethod
protected void invokeCustomInitMethod(String beanName, final Object bean, RootBeanDefinition mbd)
			throws Throwable {//獲取配置的init方法名稱
		String initMethodName = mbd.getInitMethodName();
		Assert.state(initMethodName != null, "No init method set");
		//獲取初始化方法
		Method initMethod = (mbd.isNonPublicAccessAllowed() ?
				BeanUtils.findMethod(bean.getClass(), initMethodName) :
				ClassUtils.getMethodIfAvailable(bean.getClass(), initMethodName));
		//如果找不到則判斷是否強(qiáng)制執(zhí)行,強(qiáng)制則拋異常,非強(qiáng)制則警告提示
		if (initMethod == null) {	if (mbd.isEnforceInitMethod()) {		throw new BeanDefinitionValidationException("Could not find an init method named '" +
						initMethodName + "' on bean with name '" + beanName + "'");
			}
			else {		if (logger.isTraceEnabled()) {logger.trace("No default init method named '" + initMethodName +
							"' found on bean with name '" + beanName + "'");
				}
				// Ignore non-existent default lifecycle methods.
				return;
			}
		}

		if (logger.isTraceEnabled()) {	logger.trace("Invoking init method  '" + initMethodName + "' on bean with name '" + beanName + "'");
		}
		Method methodToInvoke = ClassUtils.getInterfaceMethodIfPossible(initMethod);

		if (System.getSecurityManager() != null) {	AccessController.doPrivileged((PrivilegedAction) () ->{		ReflectionUtils.makeAccessible(methodToInvoke);
				return null;
			});
			try {		AccessController.doPrivileged((PrivilegedExceptionAction) () ->methodToInvoke.invoke(bean), getAccessControlContext());
			}
			catch (PrivilegedActionException pae) {		InvocationTargetException ex = (InvocationTargetException) pae.getException();
				throw ex.getTargetException();
			}
		}
		else {	try {	//設(shè)置權(quán)限
				ReflectionUtils.makeAccessible(methodToInvoke);
				//執(zhí)行
				methodToInvoke.invoke(bean);
			}
			catch (InvocationTargetException ex) {		throw ex.getTargetException();
			}
		}
	}方法6:applyBeanPostProcessorsAfterInitialization
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {//執(zhí)行BeanPostProcessors的postProcessAfterInitialization方法,AOP代理就是在這個(gè)步驟進(jìn)行處理的
		Object result = existingBean;
		for (BeanPostProcessor processor : getBeanPostProcessors()) {	Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {		return result;
			}
			result = current;
		}
		return result;
	}
方法7:registerDisposableBeanIfNecessary
protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
		//如果不是多例&&需要銷毀
		if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {	//如果是單例
			if (mbd.isSingleton()) {		// Register a DisposableBean implementation that performs all destruction
				// work for the given bean: DestructionAwareBeanPostProcessors,
				// DisposableBean interface, custom destroy method.
				//
				registerDisposableBean(beanName,
						new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
			}
			else {		// A bean with a custom scope...
				//根據(jù)自定義的Scope ,注冊(cè)銷毀回調(diào)方式
				Scope scope = this.scopes.get(mbd.getScope());
				if (scope == null) {throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");
				}
				scope.registerDestructionCallback(beanName,
						new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
			}
		}
	}

requiresDestruction(bean, mbd),見(jiàn)方法8詳解

方法8:requiresDestruction
protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) {//當(dāng)前bean不是null
     // 1.DisposableBeanAdapter.hasDestroyMethod(bean, mbd):判斷bean是否有destroy方法
     // 2.hasDestructionAwareBeanPostProcessors():判斷當(dāng)前BeanFactory是否注冊(cè)過(guò)DestructionAwareBeanPostProcessor
     // 3.DisposableBeanAdapter.hasApplicableProcessors:是否存在適用于bean的DestructionAwareBeanPostProcessor
		return (bean.getClass() != NullBean.class &&
				(DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || (hasDestructionAwareBeanPostProcessors() &&
						DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors()))));
	}

DisposableBeanAdapter.hasDestroyMethod(bean, mbd),見(jiàn)方法9詳解
DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors()),見(jiàn)方法10詳解

方法9:hasDestroyMethod
public static boolean hasDestroyMethod(Object bean, RootBeanDefinition beanDefinition) {//bean實(shí)現(xiàn)了DisposableBean 或AutoCloseable接口
		if (bean instanceof DisposableBean || bean instanceof AutoCloseable) {	return true;
		}
		//獲取銷毀方法名稱
		String destroyMethodName = beanDefinition.getDestroyMethodName();
		//如果自定銷毀方法名稱為 "(inferred)"
		if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)) {	//判斷是否有close或shutdown方法
			return (ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME) ||
					ClassUtils.hasMethod(bean.getClass(), SHUTDOWN_METHOD_NAME));
		}
		return StringUtils.hasLength(destroyMethodName);
	}
方法10:hasApplicableProcessors
public static boolean hasApplicableProcessors(Object bean, ListpostProcessors) {if (!CollectionUtils.isEmpty(postProcessors)) {	//遍歷后置處理器
			for (BeanPostProcessor processor : postProcessors) {		//如果有類型為DestructionAwareBeanPostProcessor的后置處理器
				if (processor instanceof DestructionAwareBeanPostProcessor) {DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor;
					//判斷是否需要由這個(gè)后置處理器進(jìn)行銷毀
					if (dabpp.requiresDestruction(bean)) {return true;
					}
				}
			}
		}
		return false;
	}
總結(jié)

到此,整個(gè)bean的創(chuàng)建流程就結(jié)束了。
1、對(duì)當(dāng)前Bean實(shí)現(xiàn)不同的Aware接口,對(duì)不同的屬性值進(jìn)行填充
2、執(zhí)行BeanPostProcessors的postProcessBeforeInitialization方法,可能會(huì)返回新的對(duì)象值。
3、調(diào)用執(zhí)行自定義的初始化方法,如果當(dāng)前Bean實(shí)現(xiàn)了InitializingBean接口,則調(diào)用afterPropertiesSet方法
4、執(zhí)行BeanPostProcessors的postProcessAfterInitialization方法,AOP代理就是在這個(gè)步驟進(jìn)行處理的
5、注冊(cè)銷毀相關(guān)方法,會(huì)在IOC銷毀流程中進(jìn)行回調(diào)。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:SpringIoC源碼:createBean(下)-創(chuàng)新互聯(lián)
當(dāng)前鏈接:http://bm7419.com/article42/cdiihc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站改版、云服務(wù)器動(dòng)態(tài)網(wǎng)站、軟件開(kāi)發(fā)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)