通过对上述源码的分析,我们可以了解在Spring配置文件中,
a. ref被封装为指向依赖对象一个引用。
b.value配置都会封装成一个字符串类型的对象。
c.ref和value都通过“解析的数据类型属性值.setSource(extractSource(ele));”方法将属性值/引用与所引用的属性关联起来。
在方法的最后对于
6.解析
在BeanDefinitionParserDelegate类中的parsePropertySubElement方法对
- //解析
元素中ref,value或者集合等子元素 public Object parsePropertySubElement(Element ele, BeanDefinition bd, String defaultValueType) { - //如果
没有使用Spring默认的命名空间,则使用用户自定义的规则解析//内嵌元素 if (!isDefaultNamespace(ele)) { - return parseNestedCustomElement(ele, bd); }
- //如果子元素是bean,则使用解析
元素的方法解析 else if (nodeNameEquals(ele, BEAN_ELEMENT)) { - BeanDefinitionHolder nestedBd = parseBeanDefinitionElement(ele, bd); if (nestedBd != null) {
- nestedBd = decorateBeanDefinitionIfRequired(ele, nestedBd, bd); }
- return nestedBd; }
- //如果子元素是ref,ref中只能有以下3个属性:bean、local、parent else if (nodeNameEquals(ele, REF_ELEMENT)) {
- //获取
元素中的bean属性值,引用其他解析的Bean的名称 //可以不再同一个Spring配置文件中,具体请参考Spring对ref的配置规则 - String refName = ele.getAttribute(BEAN_REF_ATTRIBUTE); boolean toParent = false;
- if (!StringUtils.hasLength(refName)) { //获取
元素中的local属性值,引用同一个Xml文件中配置 - //的Bean的id,local和ref不同,local只能引用同一个配置文件中的Bean refName = ele.getAttribute(LOCAL_REF_ATTRIBUTE);
- if (!StringUtils.hasLength(refName)) { //获取
元素中parent属性值,引用父级容器中的Bean - refName = ele.getAttribute(PARENT_REF_ATTRIBUTE); toParent = true;
- if (!StringUtils.hasLength(refName)) { error('bean', 'local' or 'parent' is required for element, ele);
- return null; }
- } }
- //没有配置ref的目标属性值 if (!StringUtils.hasText(refName)) {
- error( element contains empty target attribute, ele); return null;
- } //创建ref类型数据,指向被引用的对象
- RuntimeBeanReference ref = new RuntimeBeanReference(refName, toParent); //设置引用类型值是被当前子元素所引用
- ref.setSource(extractSource(ele)); return ref;
- } //如果子元素是
,使用解析ref元素的方法解析 - else if (nodeNameEquals(ele, IDREF_ELEMENT)) { return parseIdRefElement(ele);
- } //如果子元素是
,使用解析value元素的方法解析 - else if (nodeNameEquals(ele, VALUE_ELEMENT)) { return parseva lueElement(ele, defaultValueType);
- } //如果子元素是null,为
设置一个封装null值的字符串数据 - else if (nodeNameEquals(ele, NULL_ELEMENT)) { TypedStringValue nullHolder = new TypedStringValue(null);
- nullHolder.setSource(extractSource(ele)); return nullHolder;
- } //如果子元素是
,使用解析array集合子元素的方法解析 - else if (nodeNameEquals(ele, ARRAY_ELEMENT)) { return parseArrayElement(ele, bd);
- } //如果子元素是
-
,使用解析list集合子元素的方法解析
- else if (nodeNameEquals(ele, LIST_ELEMENT)) { return parseListElement(ele, bd);
- } //如果子元素是
,使用解析set集合子元素的方法解析 - else if (nodeNameEquals(ele, SET_ELEMENT)) { return parseSetElement(ele, bd);
- } //如果子元素是
- else if (nodeNameEquals(ele, MAP_ELEMENT)) { return parseMapElement(ele, bd);
- } //如果子元素是
,使用解析props集合子元素的方法解析 - else if (nodeNameEquals(ele, PROPS_ELEMENT)) { return parsePropsElement(ele);
- } //既不是ref,又不是value,也不是集合,则子元素配置错误,返