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

时间:2015-07-30 15:40:41

标签: xml spring constructor-injection

我遵循Spring Reference Documentation 4.0.0.RELEASE。它说

  

当使用简单类型时,Spring不能   确定值的类型,因此无法在没有帮助的情况下按类型匹配

方案如下

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>

但是当我忽略这条指令时,即使没有在XML配置中使用类型属性索引号参数名称,Spring容器很容易解析参数。请指导我为什么必须不必要地使用类型属性

1 个答案:

答案 0 :(得分:2)

当您忽略该指令并省略类型属性和索引号时,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正在寻找以任何顺序接受字符串和int的东西,它可以将构造函数作为匹配;这取决于它首先发现的。索引号可以防止这种情况发生,它向Spring指示参数应该出现的顺序。

当你的bean有多个构造函数时,明确描述构造函数参数似乎比希望Spring猜对了更好。