2012-12-13 125 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對象。