setter 如何在 Spring 框架内工作?
How setter works inside Spring Framework?
我是 spring 框架的新手。实际上我正在用 spring
做一个实验。
看看这个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
,下一个用 setter
参数化的变量命名为 messageee
.你看两者同名。
好的..现在看看这个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
标签内部。我已将 属性 名称声明为 message
。我不明白,当我将名称命名为 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'?
但是当我将名字命名为 message
时。它运行成功。但是我没有任何消息的方法或任何具有类似名称的变量。那么,setter
实际上是如何工作的呢?请详细说明一下好吗?
不胜感激!
首先,您混淆了字段和属性 - applicationContext.xml 中的 属性 名称也是错误的(应该是 messageee
)
您需要将 @Autowired
注释与以下任一项一起使用:
1) 字段即 messageee
或
2) setter 即 setMessage()
如果您正在考虑 "what is that!!???" 阅读有关 bean 的 Spring 的基本特性以及 Spring 如何能够将 POJO(普通旧 Java 对象)用于并使用 IoC 框架配置它们。在这里阅读@Autowired - How does autowiring work in Spring?
那你应该没问题:
<bean id="helloWorld" class="com.springframework.HelloWorld">
<property name="message" value="Hello.. This is Spring Framework example."></property>
</bean>
顺便说一句...通过使用非常基本的 Java 内容来研究 Spring 的好方法...祝您好运!
您混淆了字段(或实例变量)与属性。
属性 是来自 Java Beans 规范的术语。 bean 的 属性 foo
是可以使用名为 getFoo()
(或布尔值 isFoo()
)的 getter 方法访问的数据 and/or使用名为 setFoo()
的 setter 方法进行设置。
这些方法在内部做了什么,无论它们 get/set 是不是变量,变量是否也被命名为 foo 或其他任何东西,都是完全无关的。重要的是 getter/setter.
的名称
因此,当您定义 bean 并告诉 Spring 设置名为 message 的 属性 时,Spring 将寻找一个方法称为 setMessage()
。它不关心 bean 的私有字段 class。
Spring IoC容器也支持setter注入,这是Spring中首选的依赖注入方式。 Setter 注入使用 class 文件中的 set* 方法来获取 属性 可在 spring XML 配置中配置的名称。
从配置的角度来看,setter 注入更易于阅读,因为设置的 属性 名称连同注入的值一起作为属性分配给 bean。
要确定 属性 个名称,Spring 遵循 JavaBeans Specification。
我是 spring 框架的新手。实际上我正在用 spring
做一个实验。
看看这个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
,下一个用 setter
参数化的变量命名为 messageee
.你看两者同名。
好的..现在看看这个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
标签内部。我已将 属性 名称声明为 message
。我不明白,当我将名称命名为 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'?
但是当我将名字命名为 message
时。它运行成功。但是我没有任何消息的方法或任何具有类似名称的变量。那么,setter
实际上是如何工作的呢?请详细说明一下好吗?
不胜感激!
首先,您混淆了字段和属性 - applicationContext.xml 中的 属性 名称也是错误的(应该是 messageee
)
您需要将 @Autowired
注释与以下任一项一起使用:
1) 字段即 messageee
或
2) setter 即 setMessage()
如果您正在考虑 "what is that!!???" 阅读有关 bean 的 Spring 的基本特性以及 Spring 如何能够将 POJO(普通旧 Java 对象)用于并使用 IoC 框架配置它们。在这里阅读@Autowired - How does autowiring work in Spring?
那你应该没问题:
<bean id="helloWorld" class="com.springframework.HelloWorld">
<property name="message" value="Hello.. This is Spring Framework example."></property>
</bean>
顺便说一句...通过使用非常基本的 Java 内容来研究 Spring 的好方法...祝您好运!
您混淆了字段(或实例变量)与属性。
属性 是来自 Java Beans 规范的术语。 bean 的 属性 foo
是可以使用名为 getFoo()
(或布尔值 isFoo()
)的 getter 方法访问的数据 and/or使用名为 setFoo()
的 setter 方法进行设置。
这些方法在内部做了什么,无论它们 get/set 是不是变量,变量是否也被命名为 foo 或其他任何东西,都是完全无关的。重要的是 getter/setter.
的名称因此,当您定义 bean 并告诉 Spring 设置名为 message 的 属性 时,Spring 将寻找一个方法称为 setMessage()
。它不关心 bean 的私有字段 class。
Spring IoC容器也支持setter注入,这是Spring中首选的依赖注入方式。 Setter 注入使用 class 文件中的 set* 方法来获取 属性 可在 spring XML 配置中配置的名称。
从配置的角度来看,setter 注入更易于阅读,因为设置的 属性 名称连同注入的值一起作为属性分配给 bean。
要确定 属性 个名称,Spring 遵循 JavaBeans Specification。