繁体   English   中英

请解释一下我在Spring中通过构造函数进行自动装配的这种(模糊性)行为

[英]Please explain me this (ambiguity) behavior of autowiring through constructor in 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'进行自动装配,因此它将提供有关bean唯一性违规的例外,例如,如果我使用autowire =“byType”,就会发生这种情况。

但奇怪的是,输出如下。

OUTPUT:

不调用参数构造函数

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

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

先感谢您。

这个问题也可以在LinkedIn中找到( Spring通过构造函数歧义自动装配

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

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

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

我试过上面的例子:

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
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM