Java spring未满足的依赖性有时会表达出来

Java spring未满足的依赖性有时会表达出来,java,spring,Java,Spring,当我尝试声明这个简单bean时: <bean id="file" class="java.io.File" c:child="foo.txt" c:parent="\tmp" /> 实际上,我可以用与文件声明和Spring声明相同的方式声明它。这两项工作。。。但是为什么呢 <bean id="multipleConstructors1" class="sandbox.spring.MultipleConstructors" c:a="testing" c:b="testing

当我尝试声明这个简单bean时:

<bean id="file" class="java.io.File" c:child="foo.txt" c:parent="\tmp" />
实际上,我可以用与文件声明和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"
/>

是不是因为文件类没有被检测?e、 g.multipleconstructor是一个本地源文件,而另一个则在jdk中?

这是因为没有以某种方式检测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可以将
字符串
值转换为
文件
对象,因此可以使用两个
文件
构造函数。Spring无法选择使用哪一个

对于您自己的类,情况并非如此,您可能正在以保留参数名称的方式编译该类。或者,如果不是,那么您提供的参数将确定地映射到构造函数

例如,只能将一个构造函数应用于

c:a="testing"
c:b="testing, hello"
c:c="123"
c:a="testing"
c:b="testing, hello"
这个

public MultipleConstructors(String a, String b, int c) {
public MultipleConstructors(String a, String b) {
只有一个可以应用于

c:a="testing"
c:b="testing, hello"
c:c="123"
c:a="testing"
c:b="testing, hello"
这个

public MultipleConstructors(String a, String b, int c) {
public MultipleConstructors(String a, String b) {

你是如何编译你的
multipleconstructor
类的?就用maven编译器插件吧。谢谢你的回复。是否有任何方法可以根据源文件插入类文件以获取它?有趣的是,Eclipse中的Spring工具似乎能够识别构造函数arg名称并给出建议。但是它在运行时失败。@javamonkey79所以Eclipse和Maven实际上下载了源代码,所以您可以浏览它。但是,在运行时,类路径上提供了非源JAR。如果没有使用对参数的访问来编译这些参数,那么您就不走运了。getParameters方法似乎没有如您所描述的那样出现。哦,这仅在Java 8之后才可用。之前,我认为Spring使用字节码分析来获取参数名(如果存在)。