我编写了一个示例代码,用于使用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();
}`
答案 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解释的各种原因重写这些内容非常重要。