当我尝试声明这个简单的bean时:
<bean id="file" class="java.io.File" c:child="foo.txt" c:parent="\tmp" />
我明白了:
通过构造函数参数表示的不满意的依赖关系 类型为[java.io.File]的索引0:不明确的构造函数参数类型 - 你是否将正确的bean引用指定为构造函数参数?
好的,好的......我明白了。我可以尝试在构造函数arg上使用索引。我认为这是事实上的答案。我不能得到的,如果我有类似的课程(用于演示):
public class MultipleConstructors {
private String a;
private String b;
private int c;
private Object d;
public MultipleConstructors(String a, String b) {
this(a, b, -1, null);
}
public MultipleConstructors(String a, String b, int c) {
this(a, b, c, null);
}
public MultipleConstructors(String a, String b, int c, Object d) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
}
我实际上可以以与文件声明相同的方式声明它,而Spring让我这样做。这两项工作......但为什么呢?
<bean
id="multipleConstructors1"
class="sandbox.spring.MultipleConstructors"
c:a="testing"
c:b="testing, hello"
c:c="123"/>
<bean
id="multipleConstructors2"
class="sandbox.spring.MultipleConstructors"
c:a="testing"
c:b="testing, hello"
/>
是因为File类没有以某种方式进行检测吗?例如MultipleConstructors是一个本地源文件,而另一个是在jdk?
中答案 0 :(得分:2)
是因为File类没有以某种方式检测
是。 JDK可能以不保留参数名称的方式编译。您可以通过运行来确认这一点,例如
System.out.println(Arrays.toString(File.class.getConstructor(String.class, String.class).getParameters()));
如果打印
[java.lang.String arg0, java.lang.String arg1]
然后参数名称不会出现在用于运行程序的.class
文件中。
参数名称因此不适用于Spring,所以这两个
c:child="foo.txt" c:parent="\tmp"
无法可靠地映射到基础参数。 Spring可以从String
值转换为File
对象,因此两个File
构造函数适用。 Spring无法选择使用哪一个。
您自己的类不是这种情况,您可能正在以保留参数名称的方式进行编译。或者,如果您不是,那么您提供的参数将确定性地映射到构造函数。
例如,只能将一个构造函数应用于
c:a="testing"
c:b="testing, hello"
c:c="123"
这一个
public MultipleConstructors(String a, String b, int c) {
只有一个可以应用于
c:a="testing"
c:b="testing, hello"
这一个
public MultipleConstructors(String a, String b) {