0

我是否需要实例变量的 setter 方法才能将值注入对象?

应用:包com.process;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[]args){
        ApplicationContext context = new ClassPathXmlApplicationContext("SpringBeans.xml");
        Person sh = (Person) context.getBean("Person");
        sh.displayname();
    }
}

人:

package com.process;

public class Person {
    String name;

    public void displayname(){
        System.out.println(name);
    }
}


<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="Person" class="com.process.Person">
        <property name="name" value="Bob" />

    </bean>

</beans>

当我运行应用程序时,它会失败并显示味精 -

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'name' of bean class [com.process.Person]: Bean property 'name' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

它仅适用于 setter 方法。

问题:

我需要为每个实例变量设置 setter 方法吗?

4

2 回答 2

0

我需要为每个实例变量设置 setter 方法吗?

您需要一个 setter 方法来设置元素<property>中声明的值。<bean>

您可以有一个与字段无关的设置器。例如

public class Person {
    public void setFunky(String value){
        System.out.println("random piece of code: " + value);
    }
}

<bean id="Person" class="com.process.Person">
    <property name="funky" value="let's get funky" />
</bean>

Spring 认为它正在尝试设置setFunky()方法表示的字段,以便执行它。您不需要实际访问/更改字段。

于 2013-10-23T02:24:40.737 回答
0

要注入简单属性的值,例如primitives and Strings,您可以使用基于构造函数的依赖注入或基于 setter 的依赖注入。

基于构造函数的依赖注入:

public class Person {
    String name;

    public Person(String name){
        this.name = name;
    }
}

<bean id="Person" class="com.process.Person">
       <constructor-arg type="java.lang.String" value="Bob" />
</bean>

基于Setter的依赖注入:

public class Person {
    String name;

    public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

<bean id="Person" class="com.process.Person">
        <property name="name" value="Bob" />
</bean>

但是您不能使用@Autowired注入简单的属性,例如primitives, Strings. 以下语句取自Spring 框架参考

属性和构造函数参数设置中的显式依赖项始终覆盖自动装配。您不能自动装配所谓的简单属性,例如基元、字符串和类(以及此类简单属性的数组)。此限制是设计使然。

于 2013-10-23T03:34:47.873 回答