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;