Spring技术内幕(4)

2019-06-17 16:23

53. return null; 54. } 55. }

56. String[] aliasesArray = StringUtils.toStringArray(aliases);

57. return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray); 58. } 59.

60. return null; 61. }

在具体生成BeanDefinition以后。我们举一个对property进行解析的例子来完成对整个BeanDefinition载入过程的 分析,还是在类

BeanDefinitionParserDelegate的代码中,它对BeanDefinition中的定义一层一层地进行解析,比如 从属性元素集合到具体的每一个属性元素,然后才是对具体的属性值的处理。根据解析结果,对这些属性值的处理会封装成

PropertyValue对象并设置 到BeanDefinition对象中去,如以下代码清单所示。 Java代码 1. /**

2. * 这里对指定bean元素的property子元素集合进行解析。 3. */

4. public void parsePropertyElements(Element beanEle, BeanDefinition bd) {

5. //遍历所有bean元素下定义的property元素 6. NodeList nl = beanEle.getChildNodes(); 7. for (int i = 0; i < nl.getLength(); i++) { 8. Node node = nl.item(i);

9. if (node instanceof Element && DomUtils.nodeNameEquals(node, PROPERTY_ELEMENT)) {

10. //在判断是property元素后对该property元素进行解析的过程

11. parsePropertyElement((Element) node, bd); 12. } 13. } 14.}

15.public void parsePropertyElement(Element ele, BeanDefinition bd) {

16. //这里取得property的名字

17. String propertyName = ele.getAttribute(NAME_ATTRIBUTE); 18. if (!StringUtils.hasLength(propertyName)) {

19. error(\e);

20. return; 21. }

22. this.parseState.push(new PropertyEntry(propertyName)); 23. try {

24. //如果同一个bean中已经有同名的存在,则不进行解析,直接返回。也就是说,如果在同一个bean中有同名的property设置,那么起作用的只是第一个。

25. if (bd.getPropertyValues().contains(propertyName)) { 26. error(\ '\27. return; 28. }

29. //这里是解析property值的地方,返回的对象对应对Bean定义的property属性设置的解析结果,这个解析结果会封装到PropertyValue对象中,然后设置到BeanDefinitionHolder中去。

30. Object val = parsePropertyValue(ele, bd, propertyName);

31. PropertyValue pv = new PropertyValue(propertyName, val);

32. parseMetaElements(ele, pv); 33. pv.setSource(extractSource(ele));

34. bd.getPropertyValues().addPropertyValue(pv); 35. } 36. finally {

37. this.parseState.pop(); 38. } 39.} 40./**

41. * 这里取得property元素的值,也许是一个list或其他。 42. */

43.public Object parsePropertyValue(Element ele, BeanDefinition bd, String propertyName) {

44. String elementName = (propertyName != null) ?

45. \rtyName + \

46. \47.

48. // Should only have one child element: ref, value, list, etc.

49. NodeList nl = ele.getChildNodes(); 50. Element subElement = null;

51. for (int i = 0; i < nl.getLength(); i++) { 52. Node node = nl.item(i);

53. if (node instanceof Element && !DomUtils.nodeNameEquals(node, DESCRIPTION_ELEMENT) &&

54. !DomUtils.nodeNameEquals(node, META_ELEMENT)) {

55. // Child element is what we're looking for. 56. if (subElement != null) {

57. error(elementName + \n one sub-element\58. } 59. else {

60. subElement = (Element) node; 61. } 62. } 63. }

64. //这里判断property的属性,是ref还是value,不允许同时是ref和value。

65. boolean hasRefAttribute = ele.hasAttribute(REF_ATTRIBUTE);

66. boolean hasValueAttribute = ele.hasAttribute(VALUE_ATTRIBUTE);

67. if ((hasRefAttribute && hasValueAttribute) ||

68. ((hasRefAttribute || hasValueAttribute) && subElement != null)) {

69. error(elementName +

70. \bute OR 'value' attribute OR sub-element\71. }

72. //如果是ref,创建一个ref的数据对象RuntimeBeanReference,这个对象封装了ref的信息。 73. if (hasRefAttribute) {

74. String refName = ele.getAttribute(REF_ATTRIBUTE); 75. if (!StringUtils.hasText(refName)) {

76. error(elementName + \e\77. }

78. RuntimeBeanReference ref = new RuntimeBeanReference(refName);

79. ref.setSource(extractSource(ele)); 80. return ref;

81. } //如果是value,创建一个value的数据对象TypedStringValue ,这个对象封装了value的信息。 82. else if (hasValueAttribute) {

83. TypedStringValue valueHolder = new TypedStringValue(ele.getAttribute(VALUE_ATTRIBUTE));

84. valueHolder.setSource(extractSource(ele)); 85. return valueHolder;

86. } //如果还有子元素,触发对子元素的解析 87. else if (subElement != null) {

88. return parsePropertySubElement(subElement, bd); 89. } 90. else {

91. // Neither child element nor \ found.

92. error(elementName + \);

93. return null;


Spring技术内幕(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:现代汉语讲义——(邢福义版教材)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: