4

我先提供小代码片段,然后我会要求解释。

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"/>

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

输出:

参数化构造函数被调用

这是正常行为,可以理解

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

现在,我正在添加 B 类的新 bean 定义,如下所示。

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

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

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

所以,据我所知,由于通过构造函数在内部使用'byType'进行自动装配,因此它会给出一个关于bean唯一性违规的异常,例如,如果我使用autowire =“byType”,就会发生这种情况。

但奇怪的是,输出如下所示。

输出:

不调用参数构造函数

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

但是,请注意,如果没有在类 A 中指定默认构造函数,则会发生预期的异常。那么,这是 Spring IoC 容器的默认行为吗?如果是,请详细解释一下。

先感谢您。

LinkedIn 中也有这个问题(Spring autowiring through constructor ambiguity

4

2 回答 2

1

如果一个类有多个构造函数,其中任何一个都可以通过自动装配来满足,那么 Spring 将抛出异常,因为它无法决定要自动装配哪个 bean。

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

所以这意味着如果你有多个构造函数 spring 需要选择一个。弹簧非常聪明,可以选择可以接线的那个。因此,您仅在 B bean 上使用带有 B 参数的构造函数。如果你有两个 B bean,它不能使用这个构造函数,因为不是唯一的 B,所以它回退到默认构造函数。如果你删除这个构造函数,你就会得到异常。

于 2013-07-16T05:14:45.077 回答
0

我试过上面的例子:

爪哇

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
    }
于 2015-04-13T13:40:28.930 回答