Spring中的setter方法

时间:2013-10-23 02:20:55

标签: spring

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

应用:     package 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>

当我运行App时,它失败并带有msg -

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方法?

2 个答案:

答案 0 :(得分:0)

  

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

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

您可以拥有与字段无关的setter。例如

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()方法表示的字段,以便它将执行它。您不需要实际访问/改变字段。

答案 1 :(得分: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 framework reference

  

property和constructor-arg设置中的显式依赖项始终覆盖自动装配。您无法自动装配所谓的简单属性,例如基元,字符串和类(以及此类简单属性的数组)。这种限制是按设计的。