我正在使用Spring 3.1.0。我试图了解spring读取其xml文件的方式。我试图理解spring如何处理bean定义中的模糊条件。
例如
我有Alarm.java
package com.anshbansal.alarm2;
public class Alarm {
private String type;
private int volume;
private int hour;
public Alarm() {
}
public Alarm(String type, int volume, int hour) {
this.type = type;
this.volume = volume;
this.hour = hour;
}
public Alarm(String type, int volume) {
this.type = type;
this.volume = volume;
}
public Alarm(int volume, String type) {
this.type = type;
this.volume = volume;
}
public void setType(String type) {
this.type = type;
}
public void setVolume(int volume) {
this.volume = volume;
}
public void setHour(int hour) {
this.hour = hour;
}
@Override
public String toString() {
return "Alarm{" +
"type='" + type + '\'' +
", volume=" + volume +
", hour=" + hour +
'}';
}
}
我的spring xml文件alarm2.xml
如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="propertyRandom" abstract="true">
<constructor-arg value="23" type="int"/>
</bean>
<bean id="alarm1" class="com.anshbansal.alarm2.Alarm" parent="propertyRandom">
<constructor-arg value="10" type="int"/>
<constructor-arg value="Ringing" />
</bean>
</beans>
存在歧义,因为不能立即清楚哪个int
将进入音量,哪个将进入小时。如果我打印,我会得到以下
Alarm{type='Ringing', volume=23, hour=10}
那么spring如何读取xml文件以解析要调用的构造函数?父母先,然后是豆?它是在某处记录的吗?
我知道有一些方法可以指定index
和name
作为属性,但我也应该知道如何处理这些模棱两可的条件。这就是我问这个问题的原因。
答案 0 :(得分:3)
从春季documentation开始,
构造函数参数解析匹配使用参数进行匹配 类型。如果构造函数参数中没有潜在的歧义 一个bean定义,然后是构造函数参数的顺序 在bean定义中定义的是这些参数的顺序 当bean存在时,它被提供给适当的构造函数 实例
我找到了以下答案,解释了选择构造函数时的弹簧行为。
如果你指定一个没有索引的构造函数arg,那就是最贪婪的 可以满足给定参数的构造函数 调用(按类型匹配参数)。在java.io.File的情况下, 这是File(String parent,String child)构造函数:您的String 参数按类型匹配,因此算法使用该构造函数。
从父级继承时,构造函数参数将被合并(与合并属性集合相同)。在您的情况下,合并后的子bean构造函数参数将是
<constructor-arg value="23" type="int"/>
<constructor-arg value="10" type="int"/>
<constructor-arg value="Ringing" />
对于不明确的场景,请使用索引或构造函数参数名称。