我是否需要实例变量的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方法?
答案 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设置中的显式依赖项始终覆盖自动装配。您无法自动装配所谓的简单属性,例如基元,字符串和类(以及此类简单属性的数组)。这种限制是按设计的。