【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时候则会抛出异常。

浙公网安备 33010602011771号