1

我阅读了关于 spring bean 范围的教程,因为他们提到如果 bean 范围是prototypeSpring 容器将在每个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!

但是在Personbean 范围内,我给出了scope="prototype" 为什么它打印相同的 Hashcode ????

解释一下任何人...

提前致谢...

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>   

人.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();

    }


}
4

3 回答 3

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();

在您的代码中,您将看到单例和原型之间的区别。

于 2013-01-30T07:05:07.907 回答
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");
}
于 2013-01-30T07:10:40.813 回答
0

问题出在 Jar 文件上……早些时候我使用 Spring 2.5 jar,它会打印相同的内容hashCode ,但后来我更改了 jar,我添加了 Spring 3.0 相关的 jar,现在我得到了正确的输出。

于 2013-01-30T10:56:45.580 回答