java - Spring bean constructor-arg 内部属性解析

标签 java spring

我正在使用这些类:

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-argname 属性,它将正常工作。

谁能告诉我 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/

相关文章:

java - 没有这样的端口异常

java - 使用 commons 或 Javascript 比较两个文件

java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'category' available as request attribute 错误

javascript - 从 Spring 表达式中修改 rootObject

java - tomcat运行报错: Application not found

java - 如果在后台运行的 Spring Batch 作业将更新 sql 结果状态,如何更新 jsp 状态(从提交到处理然后成功)

java - Java 的 Random 类中可能分布不均或实现不当?

java - 提供程序 com.levigo.jbig2.util.log.JDKLoggerBridge 不是子类型

java - http响应中断的字符串? - Java, Android 3.0 平台

java - 使用 Spring Data REST 的自定义 Controller 隐藏默认端点