2012-12-13 79 views
4

这是代码:春重载构造函数注射

public class Triangle { 


private String color; 
private int height; 


public Triangle(String color,int height){ 
    this.color = color; 
    this.height = height; 
} 

public Triangle(int height ,String color){ 
    this.color = color; 
    this.height = height; 
} 

public void draw() { 
    System.out.println("Triangle is drawn , + 
      "color:"+color+" ,height:"+height); 
} 

} 

Spring配置文件是:

<bean id="triangle" class="org.tester.Triangle"> 
    <constructor-arg value="20" /> 
    <constructor-arg value="10" /> 
</bean> 

是否有任何具体的规则来确定哪个构造函数将被Spring叫什么名字?

+0

仅供参考 - 我在删除我的答案。我误解了http://static.springsource.org/spring/docs/3.1.3.RELEASE/spring-framework-reference/html/beans.html#beans-constructor-injection上的spring文档。对我来说,它似乎选择了类中的第一个构造函数,但我不认为它是有保证的,而其他人可能会得到不同的结果。 –

+0

我的WAG将是Java在使用反射时返回构造函数的顺序。我想它使用第一个修复。如果你想知道真实的答案,请查看来源。 – JustinKSU

+0

参见[Spring constructor argument ambiguity](http://stackoverflow.com/q/31728258/217324) –

回答

0

我不这么认为。请注意,您可以键入参数,例如:

<bean id="triangle" class="org.tester.Triangle"> 
    <constructor-arg type="int" value="20" /> 
    <constructor-arg value="10" /> 
</bean> 

这将消除此场景中的混淆。

+0

谢谢。但我不打算解决这个模糊问题。我打算知道Spring是如何解决这个问题的。 – NINCOMPOOP

3

在这里,第一个参数将被匹配到每个方法的第一个参数,然后参数将被匹配。

我建议下面的解决方案,以帮助消除歧义

如果你想打电话给你的第一个构造函数使用

<bean id="triangle" class="org.tester.Triangle"> 
<constructor-arg type="int"  value="20" /> 
<constructor-arg type="java.lang.String"  value="10" /> 
</bean> 

如果你想打电话给你的第二个构造使用

<bean id="triangle" class="org.tester.Triangle"> 
    <constructor-arg type="java.lang.String"value="20" /> 
    <constructor-arg type="int" value="10" /> 
</bean> 

因此,解决了模糊性问题

编辑: -

请阅读更多关于此问题here

+0

这两个构造函数都有两个参数。我打算知道哪一个人会喜欢,如果我们不提及类型? – NINCOMPOOP

0

基于对Spring 3.1.0的测试,将使用第二个构造函数。我不知道为什么,文件没有给出明确的答案。

Bitbucket code要测试,运行Main类,它将输出String FIRST或SECOND,具体取决于使用哪个构造函数创建Triangle对象。