我读了关于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"
为什么它打印相同的Hashcode ????
解释任何人......
提前致谢...
<!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>
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();
}
}
答案 0 :(得分:0)
这是因为您在hashCode
模型中覆盖了person
。
@Override
public int hashCode() {
return name.hashCode();
执行:
Person p=(Person)con.getBean("person");
Person q=(Person)con.getBean("person");
twise但对于p和q,name
属性具有相同的值,即“Hello World”。所以它打印相同的hashCode。
因此,如果不覆盖hashCode
(),输出将会有所不同。您将获得p和q的不同hashCode。
编辑:尝试
@Override
public int hashCode() {
return super.hashCode();
在您的代码中,您将看到单例和原型之间的区别。
答案 1 :(得分:0)
如另一个答案所示,您已覆盖hashCode
方法,并根据name
字符串进行计算。
您不应使用哈希代码来验证两个引用是否指向同一个对象实例。直接比较它们:
Person p=(Person)con.getBean("person");
Person q=(Person)con.getBean("person");
if (p==q) {
System.out.println("Same instance!");
} else {
System.out.println("Different instance");
}
答案 2 :(得分:0)
问题在于Jar文件...在早些时候我使用的是Spring 2.5罐子它会打印相同的hashCode
但后来我改变了罐子,我添加了Spring 3.0相关的罐子,现在我得到了正确的放置.. < / p>