栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring IoC原理(四) IoC容器的初始化过程——BeanDefinition在IoC容器中的注册

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring IoC原理(四) IoC容器的初始化过程——BeanDefinition在IoC容器中的注册

Spring IoC原理(四) IoC容器的初始化过程——BeanDefinition在IoC容器中的注册

文章目录
  • Spring IoC原理(四) IoC容器的初始化过程——BeanDefinition在IoC容器中的注册
    • 前言
    • 一、BeanDefinition的注册
    • 二、总结

前言

   在上一节Spring IoC原理(三) IoC容器的初始化过程——BeanDefinition的载入与解析中对BeanDefinition的载入与解析进行了介绍,本节将在上一节的基础上继续进行IoC容器初始化的分析。本节主要介绍的内容为BeanDefinition在IoC容器中的注册。

一、BeanDefinition的注册

   在上节调用parseBeanDefinitionElement()方法后将得到解析出来的BeanDefinitionHolder,里面储存bean的BeanDefinition,接着将调用registerBeanDefinition() 方法,将BeanDefinitionHolder传入BeanDefinition的注册,具体过程如图1-1所示。

protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
	BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
	if (bdHolder != null) {
		bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
		try {
			// Register the final decorated instance.
			BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
		}
		catch (BeanDefinitionStoreException ex) {
			getReaderContext().error("Failed to register bean definition with name '" +
					bdHolder.getBeanName() + "'", ele, ex);
		}
		// Send registration event.
		getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
	}
}

图1-1 BeanDefinition的注册过程
   BeanDefinition的注册在registerBeanDefinition()方法中进行,首先检测当前容器中是否含有同名的bean,如果含有同名的bean则判断是否允许进行覆盖, 若不允许覆盖则抛出异常。在进行注册的过程中调用hasBeanCreationStarted()方法判断是否已经有bean完成创建,若为True则表明当前容器已经完成bean的创建,因此为了线程安全所以需要使用synchronized关键字进行加锁。将beanName与BeanDefinition存入beanDefinitionMap中,并将beanName存入beanDefinitionNames中即完成注册。
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
		throws BeanDefinitionStoreException {
	BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
	if (existingDefinition != null) {
		if (!isAllowBeanDefinitionOverriding()) {
			throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
		}
		else if (existingDefinition.getRole() < beanDefinition.getRole()) {
			// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
			if (logger.isInfoEnabled()) {
				logger.info("Overriding user-defined bean definition for bean '" + beanName +
						"' with a framework-generated bean definition: replacing [" +
						existingDefinition + "] with [" + beanDefinition + "]");
			}
		}
		else if (!beanDefinition.equals(existingDefinition)) {
			if (logger.isDebugEnabled()) {
				logger.debug("Overriding bean definition for bean '" + beanName +
						"' with a different definition: replacing [" + existingDefinition +
						"] with [" + beanDefinition + "]");
			}
		}
		else {
			if (logger.isTraceEnabled()) {
				logger.trace("Overriding bean definition for bean '" + beanName +
						"' with an equivalent definition: replacing [" + existingDefinition +
						"] with [" + beanDefinition + "]");
			}
		}
		this.beanDefinitionMap.put(beanName, beanDefinition);
	}
	else {
		if (hasBeanCreationStarted()) {
			// Cannot modify startup-time collection elements anymore (for stable iteration)
			synchronized (this.beanDefinitionMap) {
				this.beanDefinitionMap.put(beanName, beanDefinition);
				List updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
				updatedDefinitions.addAll(this.beanDefinitionNames);
				updatedDefinitions.add(beanName);
				this.beanDefinitionNames = updatedDefinitions;
				removeManualSingletonName(beanName);
			}
		}
		else {
			// Still in startup registration phase
			this.beanDefinitionMap.put(beanName, beanDefinition);
			this.beanDefinitionNames.add(beanName);
			removeManualSingletonName(beanName);
		}
		this.frozenBeanDefinitionNames = null;
	}

	if (existingDefinition != null || containsSingleton(beanName)) {
		resetBeanDefinition(beanName);
	}
	else if (isConfigurationFrozen()) {
		clearByTypeCache();
	}
}
二、总结

   至此,IoC容器的初始化过程完全结束,在此基础上将进行IoC容器的依赖注入。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010487.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号