spring源码(8)注册解析的BeanDefinition
2017-04-25 09:08
676 查看
对于配置文件解析完之后,我们得到了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); } }
相关文章推荐
- Spring源码之旅(3)_BeanDefinition的解析与注册
- Spring源码分析-BeanDefinition加载、解析和注册
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- 死磕Spring系列之二,bean标签的解析和BeanDefinition的注册
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- Spring 3.2 源码解析 -- XML bean 元素到 BeanDefinition 解析过程
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【II】
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- 解析Spring源码(8)--BeanDefinitionParserDelegate
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【I】
- spring 源码解读与设计详解:6 BeanDefinitionParserDelegate与资源解析
- 辛星解析Spring3.2源码第二篇:BeanDefinitionReaderUtils
- 6-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的载入和解析)
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- SpringBoot源码分析之BeanDefinitionLoader注册主Configuration的Java配置类
- Spring源码阅读--BeanDefinition 在 IOC 容器中的注册
- Spring源码学习--Spring配置文件解析BeanDefinitionDocumentReader(三)
- Spring源码解析--Spring配置文件解析BeanDefinitionParserDelegate(四)
- Spring源码学习--Bean注入解析结果BeanDefinition
- Spring源码阅读之IoC容器初始化3 -- BeanDefinition在IoC容器中的注册