您的位置:首页 > 其它

bean标签的解析及注册。

2017-06-21 20:29 435 查看
前言:默认标签的解析是在parseDefaultElement函数中进行的,函数中主要分别对4种不同标签(import、alias、bean和beans)做了不同的处理,相关代码如下。

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {

  // 对import标签的处理

  if(delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {

    importBeanDefinitionResource(ele);

  //对alias标签的处理

  } else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {

    processAliasRegistration(ele);

  // 对bean标签的处理

 } else if(delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {

    processBeanDefinition(ele, delegate);

 // 对beans标签的处理

 }  else if(delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {

    doRegisterBeanDefinitions(ele);

  }

}

parseDefaultElement(ele, delegate); // 对默认标签进行解析

processBeanDefinition(ele, delegate); // 对bean标签的处理

BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

bdHolder = delegate.decorateBeanDefinitionIFRequired(ele, bdHolder);

BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));

逻辑总结如下:

1、首先委托BeanDefinitionDelegate类parseBeanDefinitionElement方法进行元素解析,返回BeanDefinitionHolder类型的实例bdHolder,经过这个方法后,bdHolder实例已经包含我们配置文件中配置的各种属性了,例如class、name、id、alias之类的属性。

2、当返回的bdHolder不为空的情况下若存在默认标签的子节点下再有自定义属性,还需要再次对自定义标签进行解析。

3、解析完成后,需要对解析后的bdHolder进行注册,同样,注册操作委托给了BeanDefinitionReaderUtils的registerBeanDefinition方法。

4、最后发出响应事件,通知相关的监听器,这个bean已经加载完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: