当前位置: 首页 > 知识库问答 >
问题:

使默认bean构造函数公开不会在Spring中实例化

卫琛
2023-03-14

我是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,它就可以正常工作,即使将两个构造函数都公开,它也可以正常工作。请解释为什么它会表现出这种行为???

提前谢谢。

共有1个答案

松桐
2023-03-14

我只验证过这在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