春天不满意的依赖表达......有时候

时间:2015-07-07 00:47:46

标签: java spring

当我尝试声明这个简单的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?

1 个答案:

答案 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) {