0

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

豆类.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>

雇员.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; 

    }

}

当我尝试使用 ApplicationContext 获取 bean 时,它给出了以下异常:

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

现在,如果我从默认构造函数中删除公共,它可以正常工作,即使在将两个构造函数都设为公共的情况下,它也可以正常工作。请解释为什么它会显示这种行为???

提前致谢。

4

1 回答 1

2

我只验证了这在 3.2.4 中有效,并且在 3.0.0 中无效。这里有问题的实现是ConstructorResolver#autowireConstructor()在 3.0.0 中。此方法用于解析要使用的正确构造函数。Constructor在这个实现中,我们通过使用Class#getDeclaredConstructors()which 返回来获取所有 bean 类的实例

返回一个 Constructor 对象数组,反映由该 Class 对象表示的类声明的所有构造函数。返回的数组中的元素没有排序,也没有任何特定的顺序。

然后它通过调用对这些数组进行排序

AutowireUtils.sortConstructors(candidates);

哪一个

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

换句话说,无参数构造函数将首先出现,但因为它没有 require 参数,所以会立即使autowireConstructor()方法抛出一个Exception,失败。解决方法是使您的其他构造函数具有较少限制的可见性。

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

于 2013-11-12T06:28:54.233 回答