【Spring源码深度解析学习系列】注册解析的BeanDefinition(五)

对于配置文件,解析和装饰完成之后,对于得到的beanDefinition已经可以满足后续的使用要求了,还剩下注册,也就是processBeanDefinition函数中的BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder,getReaderContext().getRegistry())代码的解析了。

public static void registerBeanDefinition(
			BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
			throws BeanDefinitionStoreException {
        //使用beanName做唯一标识注册
		// Register bean definition under primary name.
		String beanName = definitionHolder.getBeanName();
		registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
        //注册所有的别名
		// Register aliases for bean name, if any.
		String[] aliases = definitionHolder.getAliases();
		if (aliases != null) {
			for (String alias : aliases) {
				registry.registerAlias(beanName, alias);
			}
		}
	}

一、通过beanName注册BeanDefinition

对于beanDefinition的注册的处理步骤:

1、对AbstractBeanDefinition的校验,在解析XML文件的时候我们提过校验,但是此校验非彼校验,之前的校验是针对于XML格式的校验,而此时的校验是针对AbstractBeanDefinition的methodOverrides属性的。

2、对beanName已经注册的情况的处理,如果设置了不允许bean的覆盖,则需要抛出异常,否陈直接覆盖

3、加入map缓存

4、清除解析之前留下的对应beanName的缓存

二、通过别名注册BeanDefinition

别名注册的步骤如下:

1、alias与beanName相同情况处理,若alias与beanName并名称相同则不需要处理并删除原有的alias

2、alias覆盖处理。若aliasName已经使用并已经指向了另一beanName则需要用户的设置进行处理

3、alias循环检查,当A->B存在时,若再次出现A->C->B时候则会抛出异常。

  

posted @ 2018-04-03 09:32  霓裳梦竹  阅读(214)  评论(0编辑  收藏  举报