zoukankan      html  css  js  c++  java
  • 【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时候则会抛出异常。

      

  • 相关阅读:
    后缀表达式
    Linux中的硬链接和软链接
    C++中const总结
    atexit()函数
    Linux中的0号进程和1号进程
    什么是可重入函数和不可重入函数
    在线(Online)算法
    PHP验证IP地址输入的准确性:数组数值验证
    PHP网页计时工具——SESSION问题
    软件版本号命名规则
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/8706274.html
Copyright © 2011-2022 走看看