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
- spring源码(8)注册解析的BeanDefinition
- Spring源码解析-BeanDefinition在IOC容器中的注册(三)
- spring源码学习(三)解析和注册BeanDefinition(上)
- spring源码学习(四)解析和注册BeanDefinition(下)
- 7-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的注册)
- spring源码阅读(八)之BeanDefinition注册
- 【Spring源码--IOC容器的实现】(四)BeanDefinition的注册
- bean标签的解析及注册(二)解析BeanDefinition
- 6-spring源码3.2.18解读+spring技术内幕(关于BeanDefinition的载入和解析)
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【I】
- 【Spring源码--IOC容器的实现】(三)BeanDefinition的载入和解析【II】
- Spring源码分析--Ioc容器定位解析资源文件并注册BeanDefinition
- bean标签的解析及注册(四)注册解析的beanDefinition
- spring源码阅读(六)之BeanDefinition的载入
- Spring源码阅读--BeanDefinition 在 IOC 容器中的注册
- Spring源码阅读 --BeanDefinition
- spring 源码 beanDefinition.getMethodOverrides()
- 理解spring的BeanDefinition和配置文件(原文标题:动态注册bean到spring容器)
- Navicat 快捷键
- 跟随屏幕滚动后固定导航到顶端
- java小实现map家族
- java----------华为机试------------合并表记录
- Programming over R
- spring源码(8)注册解析的BeanDefinition
- lintcode(57)三数之和
- Machine Learning知识点一览
- NYOJ 303
- 多源有权图的最短路径 floyd算法(动态规划能解决负权边)7.1.3
- 微博视频怎么下载?微博视频下载和保存工具
- Java中List转换为数组,数组转List
- Linux文件权限
- APP安全之APK完整性校验