gpt4 book ai didi

java - 将默认bean构造函数设置为public在spring中不会实例化

转载 作者:行者123 更新时间:2023-12-02 06:32:51 24 4
gpt4 key购买 nike

我是 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;

}

}

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

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

现在,如果我从默认构造函数中删除公共(public),它就可以正常工作,即使将两个构造函数都设为公共(public),它也可以工作。请解释为什么它会表现出这种行为???

提前致谢。

最佳答案

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

Returns an array of Constructor objects reflecting all the constructors declared by the class represented by this Class object. The elements in the array returned are not sorted and are not in any particular order.

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

AutowireUtils.sortConstructors(candidates);

哪个

Sort the given constructors, preferring public constructors and "greedy" ones with a maximum of arguments. The result will contain public constructors first, with decreasing number of arguments, then non-public constructors, again with decreasing number of arguments.

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

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

关于java - 将默认bean构造函数设置为public在spring中不会实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com