【发布时间】:2013-01-30 05:32:00
【问题描述】:
我阅读了关于 spring bean 范围的教程,他们提到如果 bean 范围是 prototype Spring 容器将在每个 context.getBean("id") 语句中创建新对象。如果我们指定范围是singleton,即使我们写context.getBean("id") 语句两次或更多次,它也只会创建一个对象......
我做了一个小例子
Demo.java
public class Demo {
public static void main(String[] args)
{
ApplicationContext con=new ClassPathXmlApplicationContext("spconfig.xml");
Person p=(Person)con.getBean("person");
Person q=(Person)con.getBean("person");
System.out.println(" P hashCode :"+p.hashCode());
System.out.println(" Q hashCode :"+q.hashCode());
if (p==q)
{
System.out.println("Same instance!");
}
else {
System.out.println("Different instance");
}
}
}
上面的程序打印
P hashCode :18303751
Q hashCode :18303751
Same instance!
但在Person bean 范围内,我给出了scope="prototype"
为什么它打印相同的哈希码????
解释任何人...
在此先感谢...
spconfig.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="person" class="demo.Person" scope="prototype">
<property name="name" value="Hello World" />
</bean>
</beans>
Person.java
package demo;
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.println("Hello ! " + name);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
【问题讨论】:
-
不应以任何方式返回两个相同的对象。我刚刚执行了你的代码(假设 person 是一个简单的 POJO 类,属性为'name'),我得到了两个不同的对象!您是否在 Person 中覆盖了 hashcode() 以返回类似 name.hashCode() 的内容?
-
我刚试了你的最新代码,得到:P hashCode :763970039 Q hashCode :239720060 不同实例
-
@Jintian DENG : 是 Jar 文件的问题...之前我放置了旧的 jar 文件,后来我用新的 jar 检查了它的工作正常......
标签: spring inversion-of-control ioc-container