Spring以什么顺序获取constructor-args中的值

时间:2017-02-07 15:03:10

标签: java spring

我尝试过构造函数注入DI。即使我没有在type中指定<constructor-arg>,这段代码也能正常运行。

三角类:

public class Triangle {

    private String type;
    private int height;

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

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

    public Triangle(String type) {
        this.type = type;
    }

    public void draw(){
        System.out.println(getType()+ " Triangle drawn with height = "+getHeight());
    }

    public String getType() {
        return type;
    }

    public int getHeight() {
        return height;
    }
}

配置文件spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
    <bean id = "triangle" class = "model.Triangle">
        <constructor-arg value = "Isosceles"/> 
        <constructor-arg value = "20" />
    </bean>
</beans>

驱动程序类(main方法):

public class Driver {

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        Triangle triangle = (Triangle) context.getBean("triangle");
        triangle.draw();
    }
}

但是,当我在<constructor-arg>中互换地尝试spring.xml行时,异常被抛出如下:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'triangle' defined in class path resource [spring.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities)

我无法弄清楚 Spring 采用<constructor-arg>中的值的顺序。

3 个答案:

答案 0 :(得分:2)

简短回答:它的参数顺序与类构造函数中描述的顺序相同。

来自Spring docs的证明(第7.4.1节):

  

构造函数参数解析匹配使用参数进行匹配   类型。如果构造函数参数中没有潜在的歧义   一个bean定义,然后是构造函数参数的顺序   在bean定义中定义的是这些参数的顺序   当bean存在时,它被提供给适当的构造函数   实例

答案 1 :(得分:1)


与您同意,您可以按照类构造函数的顺序编写<constructor-args>。您还可以在<constructor-args>中指定索引,如下所示:

<constructor-arg index = "0" value = "Equilateral"></constructor-arg>
<constructor-arg index = "1" value= "20"></constructor-arg>

所以如果你想根据参数的顺序在多个构造函数之间解析,可以使用index
所以它会查找带有两个参数的构造函数

  • 第一个参数将设置为&#34; Equilateral &#34;与index = "0"type = Equilateral

  • 第二个参数将设置为&#34; 20 &#34;与index="1"即。 height= 20


您也可以按如下方式交换<constructor-args>

<constructor-arg index = "1" value= "20"></constructor-arg>     
<constructor-arg index = "0" value = "Equilateral"></constructor-arg>

您的程序将在没有任何例外的情况下执行。

答案 2 :(得分:0)

This post帮我写了一个问题的答案。

这是我的构造函数:

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

需要,

    类型为type
  • String(实例变量)作为第一个参数,
  • height int类型作为第二个参数。

因此,在spring.xml文件中,我们在<constructor-arg>中提供的值应与类的构造函数的顺序相同。因此,当我尝试使用这些行时,抛出异常。

<constructor-arg value = "20" />
<constructor-arg value = "Isosceles"/> 

原因是,

  
      
  • 第一个参数'20'将作为String并设置type实例变量。
  •   
  • 对于第二个参数“Isosceles”,String实例的类型不匹配(intheight转换)发生   变量
  •