2

我编写了一个示例代码来使用 setter 方法练习 Spring Bean 注入。但是在我的输出中,我得到了一个内存地址而不是我需要的值(在 List Element 列表中作为第一个元素)。

我认为这是由于 ref bean="address1" 声明中的一些错误。

感谢您是否可以帮助我纠正此错误

这是我得到的输出

列表元素:[ com.springtutorial.Address@1b6101e,列王之战,剑风暴,群鸦盛宴,魔龙狂舞] 地址:Winterfell

这是 Bean 类代码

<bean id="javaCollection" class="com.springtutorial.JavaCollection">
    <property name="addressList">
        <list>
            <ref bean="address1"/>
            <value>Clash of Kings</value>
            <value>Storm of Swords</value>
            <value>Feast for Crows</value>
            <value>Dance with Dragons</value>
        </list>
    </property>

</bean>

<bean id="address1" class="com.springtutorial.Address">
    <property name="address" value="Winterfell"/>
</bean>

这是地址类代码

public class Address {

String address;

public String getAddress() {
    System.out.println("Address :"+address);
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

Java 集合类`public class JavaCollection {

List addressList;

public List getAddressList() {
    System.out.println("List Elements: " + addressList);
    return addressList;
}

public void setAddressList(List addressList) {
    this.addressList = addressList;
}

}

`

主课是这样的

public static void main(String[] args) {

    ApplicationContext ctx = new ClassPathXmlApplicationContext("Beans.xml");
    JavaCollection jc = (JavaCollection) ctx.getBean("javaCollection");
    Address obj = (Address) ctx.getBean("address1");

    jc.getAddressList();
    jc.getAddressSet();
    jc.getAddressMap();
    jc.getAddressProp();

    obj.getAddress();
}`
4

2 回答 2

3

这不是内存地址,而是 的通常输出Object.toString(),即类名和哈希码

Spring 期望您List包含String实例,但您正在尝试添加一个Address. Spring 只是简单地调用toStringAddress以使其“适合”在集合中。

您没有声明您的Listas 参数化,但我怀疑 String 值对象的存在,例如<value>Clash of Kings</value>,导致 Spring 期望 aList<String>代替。

如果您还没有阅读过它,那么现在可能是阅读泛型的好时机。

于 2012-10-12T08:02:31.333 回答
1

那是因为您错过了在 Address 中覆盖 toString() 方法,因此您得到的默认输出女巫是对象标识符。

public String toString() {

    String stringX = //build String
    return stringX;
}

注意:您可以选择在方法顶部添加 @Override -。这有以下好处:

  • 编译器检查您是否真的覆盖了一个方法。
  • 其他程序员可以很容易地看到您正在覆盖一个方法。

即便如此,对于诸如 toString() 之类的通常被覆盖的方法来说,它可能有点多余。

其他通常应该被覆盖(但通常被遗忘)的重要方法 equals 和 toHashCode。由于这里解释的各种原因,覆盖这些很重要。

于 2012-10-12T08:04:01.193 回答