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

2014-11-24 03:05:58 · 作者: · 浏览: 4
ute(VALUE_ATTRIBUTE));
  • //设置这个value数据对象是被当前的property对象所引用 valueHolder.setSource(extractSource(ele));
  • return valueHolder; }
  • //如果当前 元素还有子元素 else if (subElement != null) {
  • //解析 的子元素 return parsePropertySubElement(subElement, bd);
  • } else {
  • //propery属性中既不是ref,也不是value属性,解析出错返回null error(elementName + must specify a ref or value, ele); return null;
  • } }

    通过对上述源码的分析,我们可以了解在Spring配置文件中, 元素中 元素的相关配置是如何处理的:

    a. ref被封装为指向依赖对象一个引用。

    b.value配置都会封装成一个字符串类型的对象。

    c.ref和value都通过“解析的数据类型属性值.setSource(extractSource(ele));”方法将属性值/引用与所引用的属性关联起来。

    在方法的最后对于 元素的子元素通过parsePropertySubElement 方法解析,我们继续分析该方法的源码,了解其解析过程。

    6.解析 元素的子元素:

    在BeanDefinitionParserDelegate类中的parsePropertySubElement方法对 中的子元素解析,源码如下:

    [java]
    1. //解析 元素中ref,value或者集合等子元素 public Object parsePropertySubElement(Element ele, BeanDefinition bd, String defaultValueType) {
    2. //如果 没有使用Spring默认的命名空间,则使用用户自定义的规则解析//内嵌元素 if (!isDefaultNamespace(ele)) {
    3. return parseNestedCustomElement(ele, bd); }
    4. //如果子元素是bean,则使用解析 元素的方法解析 else if (nodeNameEquals(ele, BEAN_ELEMENT)) {
    5. BeanDefinitionHolder nestedBd = parseBeanDefinitionElement(ele, bd); if (nestedBd != null) {
    6. nestedBd = decorateBeanDefinitionIfRequired(ele, nestedBd, bd); }
    7. return nestedBd; }
    8. //如果子元素是ref,ref中只能有以下3个属性:bean、local、parent else if (nodeNameEquals(ele, REF_ELEMENT)) {
    9. //获取 元素中的bean属性值,引用其他解析的Bean的名称 //可以不再同一个Spring配置文件中,具体请参考Spring对ref的配置规则
    10. String refName = ele.getAttribute(BEAN_REF_ATTRIBUTE); boolean toParent = false;
    11. if (!StringUtils.hasLength(refName)) { //获取 元素中的local属性值,引用同一个Xml文件中配置
    12. //的Bean的id,local和ref不同,local只能引用同一个配置文件中的Bean refName = ele.getAttribute(LOCAL_REF_ATTRIBUTE);
    13. if (!StringUtils.hasLength(refName)) { //获取 元素中parent属性值,引用父级容器中的Bean
    14. refName = ele.getAttribute(PARENT_REF_ATTRIBUTE); toParent = true;
    15. if (!StringUtils.hasLength(refName)) { error('bean', 'local' or 'parent' is required for element, ele);
    16. return null; }
    17. } }
    18. //没有配置ref的目标属性值 if (!StringUtils.hasText(refName)) {
    19. error( element contains empty target attribute, ele); return null;
    20. } //创建ref类型数据,指向被引用的对象
    21. RuntimeBeanReference ref = new RuntimeBeanReference(refName, toParent); //设置引用类型值是被当前子元素所引用
    22. ref.setSource(extractSource(ele)); return ref;
    23. } //如果子元素是 ,使用解析ref元素的方法解析
    24. else if (nodeNameEquals(ele, IDREF_ELEMENT)) { return parseIdRefElement(ele);
    25. } //如果子元素是 ,使用解析value元素的方法解析
    26. else if (nodeNameEquals(ele, VALUE_ELEMENT)) { return parseva lueElement(ele, defaultValueType);
    27. } //如果子元素是null,为 设置一个封装null值的字符串数据
    28. else if (nodeNameEquals(ele, NULL_ELEMENT)) { TypedStringValue nullHolder = new TypedStringValue(null);
    29. nullHolder.setSource(extractSource(ele)); return nullHolder;
    30. } //如果子元素是 ,使用解析array集合子元素的方法解析
    31. else if (nodeNameEquals(ele, ARRAY_ELEMENT)) { return parseArrayElement(ele, bd);
    32. } //如果子元素是 ,使用解析list集合子元素的方法解析
    33. else if (nodeNameEquals(ele, LIST_ELEMENT)) { return parseListElement(ele, bd);
    34. } //如果子元素是 ,使用解析set集合子元素的方法解析
    35. else if (nodeNameEquals(ele, SET_ELEMENT)) { return parseSetElement(ele, bd);
    36. } //如果子元素是,使用解析map集合子元素的方法解析/map>
    37. else if (nodeNameEquals(ele, MAP_ELEMENT)) { return parseMapElement(ele, bd);
    38. } //如果子元素是 ,使用解析props集合子元素的方法解析
    39. else if (nodeNameEquals(ele, PROPS_ELEMENT)) { return parsePropsElement(ele);
    40. } //既不是ref,又不是value,也不是集合,则子元素配置错误,返