Spring之默认标签的解析(五) bean标签的解析及注册(4)—— 解析子元素 constructor-arg
对构造函数的解析是非常常用的,同时也是非常复杂的,也相信大家对构造函数的配置都不陌生,举个简单的小例子 :
... ...
<beans>
<bean id="helloBean" class="com.HelloBear">
<constructor-arg index="0">
<value>张三</value>
</constructor-arg>
<constructor-arg index="1">
<value>你好 </value>
</constructor-arg>
</bean>
... ...
</beans>
- 上面的配置是 Spring构造函数配置中基础的配置,实现的功能就是对 HelloBean 自动寻找对应的构造函数,并在初始化的时候将设置的参数传入进去。
- 默认情况下是按照参数的顺序注入,当指定index索引后就可以改变注入参数的顺序
那么让我们来看看具体的 XML 解析过程 。
- parseConstructorArgElements
public void parseConstructorArgElements(Element beanEle, BeanDefinition bd) {
NodeList nl = beanEle.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (isCandidateElement(node) && nodeNameEquals(node, CONSTRUCTOR_ARG_ELEMENT)) {
parseConstructorArgElement((Element) node, bd);
}
}
}
这个结构似乎我们可以想象得到,遍历所有子元素,也就是提取所有 constructor-atg,然后进行解析,但是具体的解析却被放置在了另个函数 parseConstructorArgElement 中
提取所有 constructor-atg
- parseConstructorArgElement
/**
* Parse a constructor-arg element.
*/
public void parseConstructorArgElement(Element ele, BeanDefinition bd) {
// 提起index属性
String indexAttr = ele.getAttribute(INDEX_ATTRIBUTE);
// 提起type属性
String typeAttr = ele.getAttribute(TYPE_ATTRIBUTE);
// 提起name属性
String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
if (StringUtils.hasLength(indexAttr)) {
try {
int index = Integer.parseInt(indexAttr);
if (index < 0) {
error("'index' cannot be lower than 0", ele);
}
else {
try {
this.parseState.push(new ConstructorArgumentEntry(index));<