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