我是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>
Employee.java
package com.asd.bean;
public class Employee {
private String name;
private String empId;
public Employee() {
System.out.println("Employee no-args constructor");
}
Employee(String name, String empId)
{
System.out.println("Employee 2-args constructor");
this.name=name;
this.empId=empId;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the empId
*/
public String getEmpId() {
return empId;
}
/**
* @param empId the empId to set
*/
public void setEmpId(String empId) {
this.empId = empId;
}
public String toString() {
return "Name : "+name+"\nEID : "+empId;
}
}
当我尝试使用Application Context获取bean时,它会给出以下异常:
线程“main”组织中出现异常。springframework。豆。工厂BeanCreationException:创建在类路径资源[Problem.xml]中定义的名为“employee”的bean时出错:指定了2个构造函数参数,但在bean“employee”中找不到匹配的构造函数(提示:为简单html" target="_blank">参数指定索引/类型/名称参数以避免类型歧义)
现在,如果我从默认构造函数中删除public,它就可以正常工作,即使将两个构造函数都公开,它也可以正常工作。请解释为什么它会表现出这种行为???
提前谢谢。
我只验证过这在3.2.4中有效,在3.0.0中无效。这里讨论的实现是3.0.0中的ConstructorResolver#autowireConstructor()
。此方法用于解析要使用的正确构造函数。在此实现中,我们通过使用返回的Class#getDeclaredConstructors()
来获取所有bean类的构造函数
实例
返回构造函数对象数组,该数组反映了由该类对象表示的类声明的所有构造函数。返回的数组中的元素没有排序,也没有任何特定的顺序。
然后它通过调用对这些数组进行排序
AutowireUtils.sortConstructors(candidates);
哪一个
对给定的构造函数进行排序,首选公共构造函数和参数最多的“贪婪”构造函数。结果将首先包含公共构造函数(参数数量减少),然后包含非公共构造函数(参数数量减少)。
换句话说,no-arg构造函数将首先出现,但由于它没有必需参数,因此会立即使autowireConstructor()
方法抛出Exception
,失败。解决方法是让您的其他构造函数具有较少限制的可见性。
在3.2.4实现中,虽然它仍然对构造函数进行相同的排序,但如果发现构造函数的参数列表与参数数不匹配,则会跳过它。在这种情况下,它将起作用。no arg构造函数将被跳过,2参数构造函数将被匹配、解析和使用。
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数
图 6.1 time1.cpp 中的构造函数将 hour、minute 和 second 初始化为 0(即军用时间午夜11时)。 构造函数可以包含默认参数。图 6.8 重新定义 Time 的构造函数,该函数中每个变量的默认参数为0。通过提供构造函数默认参数,即使在构造函数调用中不提供数值,对象也能利用默认参数初始化为一致状态。程序员提供所有参数默认值(或显式不要求参数)的构造函数也称为默认构造函数
我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这
问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造
问题内容: 我不想为我的班级创建默认的构造函数。 但是Spring似乎坚持: 这真的有必要吗? 问题答案: 你是如何定义bean的?听起来你可能已经告诉Spring实例化你的bean,例如以下之一: 没有提供构造函数参数的地方。前一个将使用默认(或不使用arg)构造函数。如果要使用接受参数的构造函数,则需要使用如下元素来指定它们: 如果你想在你的应用程序上下文引用另一个bean中,你可以使用它做的
Spring靴和jpa给出了错误 项目的github链接https://github.com/dishankgoyal/springsBoot/tree/master/faculty_project