快速业务通道

Spring源代码解析(一):IOC容器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
    }          else {            delegate.parseCustomElement(ele);          }        }      }    } else {      delegate.parseCustomElement(root);    } } private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {    //这里对元素Import进行处理    if (DomUtils.nodeNameEquals(ele, IMPORT_ELEMENT)) {      importBeanDefinitionResource(ele);    }    else if (DomUtils.nodeNameEquals(ele, ALIAS_ELEMENT)) {      String name = ele.getAttribute(NAME_ATTRIBUTE);      String alias = ele.getAttribute(ALIAS_ATTRIBUTE);      getReaderContext().getReader().getBeanFactory().registerAlias(name, alias);      getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));    }    //这里对我们最熟悉的bean元素进行处理    else if (DomUtils.nodeNameEquals(ele, BEAN_ELEMENT)) {      //委托给BeanDefinitionParserDelegate来完成对bean元素的处理,这个类包含了具体的bean解析的过程。      // 把解析bean文件得到的信息放到BeanDefinition里,他是bean信息的主要载体,也是IOC容器的管理对象。      BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);      if (bdHolder != null) {        bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);        // 这里是向IOC容器注册,实际上是放到IOC容器的一个map里          BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());        // 这里向IOC容器发送事件,表示解析和注册完成。        getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));      }    } }

Spring源代码解析(一):IOC容器(7)

时间:2011-03-29

我们看到在parseBeanDefinition中对具体bean元素的解析式交给BeanDefinitionParserDelegate来完成的,下面我们看看解析完的bean是怎样在IOC容器中注册的:

在BeanDefinitionReaderUtils调用的是:

代码

public static void registerBeanDefinition(      BeanDefinitionHolder bdHolder, BeanDefinitionRegistry beanFactory) throws BeansException {    // 这里得到需要注册bean的名字;    String beanName = bdHolder.getBeanName();    //这是调用IOC来注册的bean的过程,需要得到BeanDefinition    beanFactory.registerBeanDefinition(beanName, bdHolder.getBeanDefinition());    // 别名也是可以通过IOC容器和bean联系起来的进行注册    String[] aliases = bdHolder.getAliases();    if (aliases != null) {      for (int i = 0; i < aliases.length; i++) {        beanFactory.registerAlias(beanName, aliases[i]);      }    } }

我们看看XmlBeanFactory中的注册实现:

代码

//--------------------------------------------------------------------- // 这里是IOC容器对BeanDefinitionRegistry接口的实现 //--------------------------------------------------------------------- public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)      throws BeanDefinitionStoreException {    .....//这里省略了对BeanDefinition的验证过程    //先看看在容器里是不是已经有了同名的bean,如果

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号