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

2014-11-24 03:05:58 · 作者: · 浏览: 5
  • //解析 别名元素,为Bean向Spring IoC容器注册别名 protected void processAliasRegistration(Element ele) {
  • //获取 别名元素中name的属性值 String name = ele.getAttribute(NAME_ATTRIBUTE);
  • //获取 别名元素中alias的属性值 String alias = ele.getAttribute(ALIAS_ATTRIBUTE);
  • boolean valid = true; // 别名元素的name属性值为空
  • if (!StringUtils.hasText(name)) { getReaderContext().error(Name must not be empty, ele);
  • valid = false; }
  • // 别名元素的alias属性值为空 if (!StringUtils.hasText(alias)) {
  • getReaderContext().error(Alias must not be empty, ele); valid = false;
  • } if (valid) {
  • try { //向容器的资源读入器注册别名
  • getReaderContext().getRegistry().registerAlias(name, alias); }
  • catch (Exception ex) { getReaderContext().error(Failed to register alias ' + alias +
  • ' for bean with name ' + name + ', ele, ex); }
  • //在解析完 元素之后,发送容器别名处理完成事件 getReaderContext().fireAliasRegistered(name, alias, extractSource(ele));
  • } }
  • //解析Bean定义资源Document对象的普通元素 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
  • // BeanDefinitionHolder是对BeanDefinition的封装,即Bean定义的封装类 //对Document对象中 元素的解析由BeanDefinitionParserDelegate实现 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
  • if (bdHolder != null) { bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
  • try { //向Spring IoC容器注册解析得到的Bean定义,这是Bean定义向IoC容器注册的入口 BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
  • } catch (BeanDefinitionStoreException ex) {
  • getReaderContext().error(Failed to register bean definition with name ' + bdHolder.getBeanName() + ', ele, ex);
  • } //在完成向Spring IoC容器注册解析得到的Bean定义之后,发送注册事件
  • getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder)); }
  • }

    通过上述Spring IoC容器对载入的Bean定义Document解析可以看出,我们使用Spring时,在Spring配置文件中可以使用 元素来导入IoC容器所需要的其他资源,Spring IoC容器在解析时会首先将指定导入的资源加载进容器中。使用 别名时,Spring IoC容器首先将别名元素所定义的别名注册到容器中。

    对于既不是 元素,又不是 元素的元素,即Spring配置文件中普通的 元素的解析由BeanDefinitionParserDelegate类的parseBeanDefinitionElement方法来实现。

    4.BeanDefinitionParserDelegate解析Bean定义资源文件中的 元素:

    Bean定义资源文件中的 元素解析在DefaultBeanDefinitionDocumentReader中已经完成,对Bean定义资源文件中使用最多的 元素交由BeanDefinitionParserDelegate来解析,其解析实现的源码如下:

    [java]
    1. //解析 元素的入口 public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) {
    2. return parseBeanDefinitionElement(ele, null); }
    3. //解析Bean定义资源文件中的 元素,这个方法中主要处理 元素的id,name //和别名属性
    4. public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) { //获取 元素中的id属性值
    5. String id = ele.getAttribute(ID_ATTRIBUTE); //获取 元素中的name属性值
    6. String nameAttr = ele.getAttribute(NAME_ATTRIBUTE); ////获取 元素中的alias属性值
    7. List aliases = new ArrayList (); //将 元素中的所有name属性值存放到别名中
    8. if (StringUtils.hasLength(nameAttr)) { String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, BEAN_NAME_DELIMITERS);
    9. aliases.addAll(Arrays.asList(nameArr)); }
    10. String beanName = id; //如果 元素中没有配置id属性时,将别名中的第一个值赋值给beanName
    11. if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) { beanName = aliases.remove(0);
    12. if (logger.isDebugEnabled()) { logger.debug(No XML 'id' specified - using ' + beanName +
    13. ' as bean name and + aliases + as aliases); }
    14. } //检查 元素所配置的id或者name的唯一性,containingBean标识
    15. //元素中是否包含子 元素 if (containingBean == null) {
    16. //检查 元素所配置