我正在使用这些类:
Coach.java
public interface Coach {
void getDailyWorkout();
String getName();
String getExperience();
}
TrackCoach.java
public class TrackCoach implements Coach {
private String name;
private String experience;
public TrackCoach(String name, int num, String experience) {
this.name = name;
this.experience = experience;
}
public void getDailyWorkout() {
System.out.println("Run 5k on track");
}
public String getName() {
return name;
}
public String getExperience() {
return experience;
}
@Override
public String toString() {
return "TrackCoach{" +
"name='" + name + '\'' +
", experience='" + experience + '\'' +
'}';
}
}
appContext.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-3.0.xsd">
<bean id="coach4" class="com.prakhar.TrackCoach">
<constructor-arg value="7 years"/>
<constructor-arg name="name" value="Mr. Track #4"/>
<constructor-arg name="num" value="10"/>
</bean>
</beans>
当我尝试获取 coach4
bean 时,收到 UnsatisfiedDependencyException 类型的错误。我无法理解 Spring 如何解析构造函数参数、实际步骤/流程。这对我来说就像一个魔法,有时有效,有时无效。例如,如果我们删除第二个 constructor-arg
的 name
属性,它将正常工作。
谁能告诉我 Spring 如何在内部解析构造函数参数?我使用的是 Spring 5.2.3。
最佳答案
根据您的情况,顺序很重要:
<bean id="coach4" class="com.prakhar.TrackCoach">
<constructor-arg value="7 years"/>
<constructor-arg name="name" value="Mr. Track #4"/>
<constructor-arg name="num" value="10"/>
</bean>
public TrackCoach(String name, int num, String experience) {
因此,第一个构造函数参数被解释为名称,因为它是 TrackerCoach 类中构造函数的第一个参数。 然后你有第二个构造函数参数,它有 name 属性,它的值是 name,因为发生了这种冲突。您有 2 个与名称构造函数参数匹配的参数和 0 个与经验匹配的参数。 当您删除 XML 中的姓名属性时,7 年会变成Mr. 的姓名。跟踪 #4 个目标作为经验,跟踪 10 个目标作为数字。
希望这有帮助。
关于java - Spring bean constructor-arg 内部属性解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59766406/