4

我首先提供了小代碼片段,然後我會要求解釋。請解釋我通過構造函數在Spring中自動裝配的這種(模糊性)行爲

public class A { 
    private String msg; 
    private B b; 

    public A() { 
     System.out.println("No argument constructor is called"); 
    } 

    public A (B b) { 
     System.out.println("Parameterized constructor is called"); 
     this.b = b; 
    } 

    // getters and setters 
} 

=========================================== ===

<bean id="a" class="A" p:msg="hello" autowire="constructor"/> 

<bean id="b" class="B"/> 

======================================== ======

OUTPUT:

參數的構造函數被調用

這是正常行爲&理解

===================================== =========

現在,我添加了一個新的類B的bean定義,如下所示。

<bean id="a" class="A" p:msg="hello" autowire="constructor"/> 

<bean id="b" class="B"/> 

<bean id="c" class="B"/> 

所以,就我知道的,因爲通過構造函數自動裝配在內部使用「byType的」,因此它會給關於豆唯一性衝突的例外,如出現這種情況,如果我會用自動裝配=「byType的」 。

但奇怪的是,輸出如下。

OUTPUT:

無參數的構造函數被調用

=========================== =============

但是,請注意,如果在類A中沒有指定默認構造函數,則會發生期望的異常。那麼,它是Spring IoC容器的默認行爲嗎?如果是的話,請詳細解釋一下。

預先感謝您。

的問題是,也可以在LinkedIn(Spring autowiring through constructor ambiguity

回答

1

如果一個類有多個構造函數,其中任何一個都可以通過自動裝配來滿足,那麼Spring會拋出異常,因爲它無法決定哪些豆自動-線。

http://www.studytrails.com/frameworks/spring/spring-auto-wire-constructor.jsp

所以說,如果你有多個構造春天必須選擇其中之一。春天是非常聰明的選擇它可以導線。所以它只有在B bean上使用帶B參數的構造函數。如果你有兩個B bean,它不能使用這個構造函數,因爲它不是唯一的B,所以它回退到默認的構造函數。你刪除這個構造函數就會得到異常。

+0

謝謝你的回答。我可以很容易地理解這種行爲,但對其原因感到困惑。 – Pushan

0

我試圖上面的例子:

A.java

package com.constructor; 

public class A { 

     private String msg; 
     private B b; 

     public A() { 
      System.out.println("No argument constructor is called"); 
     } 

     public A (B b) { 
      System.out.println("Parameterized constructor is called"); 
      this.b = b; 
     } 

    public String getMsg() { 
     return msg; 
    } 

    public void setMsg(String msg) { 
     this.msg = msg; 
    } 

    public B getB() { 
     return b; 
    } 

    public void setB(B b) { 
     this.b = b; 
    } 

     // getters and setters 
    } 
+0

您嘗試過,但發現了什麼?答案在哪裏? – Panther

相關問題