Spring Injecting Bean Reference打印内存地址而不是值

时间:2012-10-12 07:57:03

标签: java spring javabeans

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

我认为这是由于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 Collection类`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();
}`

2 个答案:

答案 0 :(得分:3)

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

Spring希望您的List包含String个实例,但您尝试添加Address。 Spring只需在toString上调用Address即可使其“适合”该集合。

您没有将List声明为参数化,但我怀疑是否存在String值对象,例如<value>Clash of Kings</value>,正在引导Spring期待List<String>

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

答案 1 :(得分:1)

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

public String toString() {

    String stringX = //build String
    return stringX;
}

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

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

即便如此,对于像toString()这样的通用覆盖方法来说,它可能有点不完整。

通常应该重写(但通常被遗忘)的其他重要方法等于和toHashCode。由here解释的各种原因重写这些内容非常重要。