Spring框架学习[IoC容器解析Bean](三)

2014-11-24 03:05:58 · 作者: · 浏览: 6
oreException { Assert.hasText(beanName, Bean name must not be empty);
  • Assert.notNull(beanDefinition, BeanDefinition must not be null); //校验解析的BeanDefiniton
  • if (beanDefinition instanceof AbstractBeanDefinition) { try {
  • ((AbstractBeanDefinition) beanDefinition).validate(); }
  • catch (BeanDefinitionValidationException ex) { throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
  • Validation of bean definition failed, ex); }
  • } //注册的过程中需要线程同步,以保证数据的一致性
  • synchronized (this.beanDefinitionMap) { Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
  • //检查是否有同名的BeanDefinition已经在IoC容器中注册,如果已经注册, //并且不允许覆盖已注册的Bean,则抛出注册失败异常
  • if (oldBeanDefinition != null) { if (!this.allowBeanDefinitionOverriding) {
  • throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, Cannot register bean definition [ + beanDefinition + ] for bean ' + beanName +
  • ': There is already [ + oldBeanDefinition + ] bound.); }
  • else {//如果允许覆盖,则同名的Bean,后注册的覆盖先注册的 if (this.logger.isInfoEnabled()) {
  • this.logger.info(Overriding bean definition for bean ' + beanName + ': replacing [ + oldBeanDefinition + ] with [ + beanDefinition + ]);
  • } }
  • } //IoC容器中没有已经注册同名的Bean,按正常注册流程注册
  • else { this.beanDefinitionNames.add(beanName);
  • this.frozenBeanDefinitionNames = null; }
  • this.beanDefinitionMap.put(beanName, beanDefinition); //重置所有已经注册过的BeanDefinition的缓存
  • resetBeanDefinition(beanName); }
  • }

    至此,Bean定义资源文件中配置的Bean被解析过后,已经注册到IoC容器中,被容器管理起来,真正完成了IoC容器初始化所做的全部工作。现在IoC容器中已经建立了整个Bean的配置信息,这些BeanDefinition信息已经可以使用,并且可以被检索,IoC容器的作用就是对这些注册的Bean定义信息进行处理和维护。这些的注册的Bean定义信息是IoC容器控制反转的基础,正是有了这些注册的数据,容器才可以进行依赖注入。