我尝试过构造函数注入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>
中的值的顺序。
答案 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
实例的类型不匹配(int
到height
转换)发生 变量