Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在spring中没有实例化将默认bean构造函数公开_Java_Spring - Fatal编程技术网

Java 在spring中没有实例化将默认bean构造函数公开

Java 在spring中没有实例化将默认bean构造函数公开,java,spring,Java,Spring,我是春天的新手。我创建了一个bean类和一个配置文件,如下所示: Beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.spring

我是春天的新手。我创建了一个bean类和一个配置文件,如下所示:

Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="employee" class="com.asd.bean.Employee">
        <constructor-arg index="0" type="java.lang.String" value="kuldeep" />
        <constructor-arg index="1" type="java.lang.String" value="1234567" />
    </bean>

</beans>
当我尝试使用ApplicationContext获取bean时,会出现以下异常:

线程“main”org.springframework.beans.factory.BeanCreationException中出现异常:创建在类路径资源[Problem.xml]中定义了名为“employee”的bean时出错:指定了2个构造函数参数,但在bean“employee”中找不到匹配的构造函数(提示:为简单参数指定索引/类型/名称参数以避免类型歧义)

现在,如果我从默认构造函数中删除public,它工作得很好,即使将两个构造函数都公开,它也工作得很好。请解释为什么它会显示这种行为


提前感谢。

我只在3.2.4中验证了这一点,但在3.0.0中没有验证。这里讨论的实现是
ConstructorResolver#autowireConstructor()
在3.0.0中。此方法用于解析要使用的正确构造函数。在此实现中,我们通过使用返回

返回反映所有 由该类对象表示的类声明的构造函数。 返回的数组中的元素未排序,并且不在任何位置 特定顺序

然后,它通过调用

AutowireUtils.sortConstructors(candidates);
哪个

对给定构造函数进行排序,优先选择公共构造函数和 “贪婪”参数最多的参数。结果将包含 首先是公共构造函数,参数数量减少,然后是 非公共构造函数,参数数量也在减少

换句话说,no-arg构造函数将首先出现,但由于它没有require参数,因此会立即使
autowireConstructor()
方法引发
异常
,失败。解决方法是使其他构造函数具有较少的限制性可见性


在3.2.4实现中,尽管它仍然对同一个构造函数进行排序,但如果发现构造函数的参数列表与参数数量不匹配,则跳过该构造函数。在这种情况下,它将起作用。将跳过无参数构造函数,并匹配、解析和使用2参数构造函数。

Sp的哪个版本你在吗?不管构造函数上的可见性修饰符是什么,这对我来说都很好。可能是Employee(字符串名称,字符串empId)不可见。将其公开。@Masud否,这与Spring无关。如果需要,它将使
构造函数可以访问。Thanx Sotirios和Masud,我使用的是Spring 3.0.0。如果使用相同的可见性修饰符使两个构造函数都工作。唯一不执行的情况是:使用公共修饰符的默认构造函数和默认访问的参数修饰符..Hi@SotiriosDelimanolis我也用2.5试过了。它不起作用。
AutowireUtils.sortConstructors(candidates);