我是Spring Framework的新手.实际上我实际上正在做一个春天的实验.
看看这个HelloWorld.java:
public class HelloWorld {
private String messageee;
public void setMessage(String messageee){
this.messageee=messageee;
}
public void show(){
System.out.println("message: "+messageee);
}
}
你在这个程序中看到,我有一个外部声明为private的变量,命名为messageee,下一个变量是使用名为messageee的setter进行参数化的.你看,两者都有相同的名字.
好的..现在看看这个bean文件:
<?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.xsd">
<bean id="helloWorld" class="com.springframework.HelloWorld">
<property name="message" value="Hello.. This is Spring Framework example."></property>
</bean>
</beans>
在这里你看到内部bean标签.我已将属性名称声明为消息.我不明白,当我将名称作为messageee时,它会给出一个错误:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'helloWorld' defined in class path resource [beans.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'messageee' of bean class [com.springframework.HelloWorld]: Bean property 'messageee' is not writable or has an invalid setter method. Did you mean 'message'?
但是当我把这个名字作为信息时.它运行成功.但我没有任何消息的方法或任何类似名称的变量.那么,setter究竟如何运作?请你详细说明一下吗?
帮助将不胜感激!
解决方法:
您将字段(或实例变量)与属性混淆.
属性是来自Java Beans规范的术语. bean的属性foo是可以使用名为getFoo()的getter方法(或布尔的isFoo())和/或使用名为setFoo()的setter方法设置的数据.
这些方法在内部做什么,无论它们是否获取/设置变量,变量是否也被命名为foo或其他任何变量,都是完全无关紧要的.重要的是getter / setter的名称.
因此,当您定义bean并告诉Spring设置名为message的属性时,Spring将查找名为setMessage()的方法.它不关心bean类的私有字段.