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 解析、注册、实例化流程源码剖析