spring源码(8)注册解析的BeanDefinition

来源:互联网 发布:比比多味豆淘宝 编辑:程序博客网 时间:2024/06/05 09:58

对于配置文件解析完之后,我们得到了beanDefinition。下一步就是注册。 同样,注册操作委托给BeanDefinitionReaderUtils.registerBeanDefinition。

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

一、使用beanName做唯一标识注册

对于BeanDefinition的注册,spring将beanName,放入list集合beanDefinitionNames。BeanDefinition放入Map集合beanDefinitionMap中。

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)            throws BeanDefinitionStoreException {        Assert.hasText(beanName, "Bean name must not be empty");        Assert.notNull(beanDefinition, "BeanDefinition must not be null");        if (beanDefinition instanceof AbstractBeanDefinition) {            try {                ((AbstractBeanDefinition) beanDefinition).validate();            }            catch (BeanDefinitionValidationException ex) {                throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,                        "Validation of bean definition failed", ex);            }        }        BeanDefinition oldBeanDefinition;        //对beanDefinitionMap增加同步操作        synchronized (this.beanDefinitionMap) {            oldBeanDefinition = this.beanDefinitionMap.get(beanName);            if (oldBeanDefinition != null) {                //如果配置了bean不允许被覆盖,则抛出异常                if (!this.allowBeanDefinitionOverriding) {                    throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,                            "Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +                            "': There is already [" + oldBeanDefinition + "] bound.");                }                else {                    if (this.logger.isInfoEnabled()) {                        this.logger.info("Overriding bean definition for bean '" + beanName +                                "': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");                    }                }            }            else {                //记录BeanName                this.beanDefinitionNames.add(beanName);                this.frozenBeanDefinitionNames = null;            }            //记录beanDefinition            this.beanDefinitionMap.put(beanName, beanDefinition);        }        if (oldBeanDefinition != null || containsSingleton(beanName)) {            resetBeanDefinition(beanName);        }    }

二、注册所有的别名

别名存放在Map集合aliasMap中

public void registerAlias(String name, String alias) {        Assert.hasText(name, "'name' must not be empty");        Assert.hasText(alias, "'alias' must not be empty");        //如果alias与beanName相同,删除原有的alias        if (alias.equals(name)) {            this.aliasMap.remove(alias);        }        else {            //若不允许覆盖,别名已经被其他bean使用,则抛出异常            if (!allowAliasOverriding()) {                String registeredName = this.aliasMap.get(alias);                if (registeredName != null && !registeredName.equals(name)) {                    throw new IllegalStateException("Cannot register alias '" + alias + "' for name '" +                            name + "': It is already registered for name '" + registeredName + "'.");                }            }            //循环检查            checkForAliasCircle(name, alias);            this.aliasMap.put(alias, name);        }    }
0 0
原创粉丝点击