spring bean 默认解析流程

        以xml文件方式定义的bean为例,XmlBeanDefinitionReader 是xml形式的bean 定义读取器,首先它通过DefaultDocumentLoader将xml信息转换成dom文档对象,然后将实际注册xml文档定义的bean的任务委托给了
DefaultBeanDefinitionDocumentReader类。改类会将每一个bean 定义注册到给定的的bean factory。

具体的解析bean的任务则委托给了BeanDefinitionParserDelegate类。


下面看下DefaultBeanDefinitionDocumentReader类的registerBeanDefinitions()方法:


public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
  this.readerContext = readerContext;

  logger.debug("Loading bean definitions");
  Element root = doc.getDocumentElement();

  BeanDefinitionParserDelegate delegate = createHelper(readerContext, root);

  preProcessXml(root);
  parseBeanDefinitions(root, delegate);
  postProcessXml(root);
 }


首先对root元素进行预处理,然后在解析改元素,最后对root元素进行后处理。

其实preProcessXml(root)和postProcessXml(root)方法是在完成处理bean定义前后去扩展

处理任何自定义元素,默认没有实现任何功能。
parseBeanDefinitions()方法则是从根级别解析元素,如果是默认空间http://www.springframework.org/schema/beans或者为null,则解析默认元素,否则解析自定义元素。


protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
  if (delegate.isDefaultNamespace(root.getNamespaceURI())) {
   NodeList nl = root.getChildNodes();
   for (int i = 0; i < nl.getLength(); i++) {
    Node node = nl.item(i);
    if (node instanceof Element) {
     Element ele = (Element) node;
     String namespaceUri = ele.getNamespaceURI();
     if (delegate.isDefaultNamespace(namespaceUri)) {
      parseDefaultElement(ele, delegate);//解析默认元素
     }
     else {
      delegate.parseCustomElement(ele);//解析自定义元素
     }
    }
   }
  }
  else {
   delegate.parseCustomElement(root); //解析自定义元素
  }
 }


首先查看 default的解析,default包含如下几个标签,分别解析


private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
  if (DomUtils.nodeNameEquals(ele, IMPORT_ELEMENT)) {
   importBeanDefinitionResource(ele);
  }
  else if (DomUtils.nodeNameEquals(ele, ALIAS_ELEMENT)) {
   processAliasRegistration(ele);
  }
  else if (DomUtils.nodeNameEquals(ele, BEAN_ELEMENT)) {   //TODO:处理xml中定义的bean元素
   processBeanDefinition(ele, delegate);
  }
 }

 

默认元素中bean 定义的解析顺序


parseMetaElements(ele, bd);
   parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
   parseReplacedMethodSubElements(ele, bd.getMethodOverrides());

parseConstructorArgElements(ele, bd);
parsePropertyElements(ele, bd);

 

在解析子元素和属性的时候判断他们的类型(List,Map,Properties,Ref),

根据具体的类型调用相应的方法。解析完成,组装成BeanComponentDefinition

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值