Spring源码深度解析学习系列注册解析的BeanDefinition

Posted 霓裳梦竹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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时候则会抛出异常。

  

以上是关于Spring源码深度解析学习系列注册解析的BeanDefinition的主要内容,如果未能解决你的问题,请参考以下文章

spring源码深度解析— IOC 之 开启 bean 的加载

Spring系列(一)Spring MVC bean 解析、注册、实例化流程源码剖析

Spring源码分析bean标签的解析及注册

4Spring 源码学习 ~ 默认标签的解析之 Bean 标签注册

Spring Boot Bean 解析

Spring源码深度解析学习系列默认标签解析