Java 在spring中没有实例化将默认bean构造函数公开
我是春天的新手。我创建了一个bean类和一个配置文件,如下所示: Beans.xmlJava 在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
<?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);