Spring 简单类型的构造函数参数歧义

Spring Constructor Argument Ambiguity with Simple Types

我正在关注 Spring 参考文档 4.0.0.RELEASE。它说

When a simple type is used, Spring cannot determine the type of the value, and so cannot match by type without help

场景如下

package examples;
public class ExampleBean {
    private int years;
    private String ultimateAnswer;
    public ExampleBean(int years, String ultimateAnswer) {
        this.years = years;
        this.ultimateAnswer = ultimateAnswer;
     }
 }

现在解析参数,指示在XML

中使用类型属性
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>

但是当我忽略这条指令时,即使不使用 type 属性 or index number or name of argument 在 XML 配置中,Spring 容器很容易解析参数。请指导我为什么不必要地使用 type 属性

当您忽略指令并省略类型属性和索引号时,Spring 使用自己的规则来决定如何解释这些值。如果您没有 Spring 容易混淆的多个构造函数,这就足够了。

如果您的构造函数具有相同数量的不同类型的参数,那么类型属性将阐明您打算调用哪个构造函数。但是,Spring 不使用构造函数参数在 XML 中出现的顺序来确定要使用哪个构造函数,因此如果您有多个构造函数,例如

public ExampleBean(int years, String ultimateAnswer) {
        ...
}

public ExampleBean(String stuff, int someNumber) {
    ...
}

那么Spring不区分这些,如果你配置成

<bean id="exampleBean" class="examples.ExampleBean">
    <constructor-arg type="int" value="1"/>
   <constructor-arg type="java.lang.String" value="foo"/>
</bean>

然后 Spring 正在寻找以任一顺序接受字符串和整数的东西,并且它可以将任一构造函数作为匹配项;这取决于它首先找到哪个。索引号防止这种情况发生,它指示 Spring 参数应该以什么顺序出现。

当您的 bean 有多个构造函数时,显式描述构造函数参数似乎比希望 Spring 猜对更好。