Spring 2.5中单例和原型范围之间的区别是什么

时间:2013-01-30 05:32:01

标签: spring inversion-of-control ioc-container

我读了关于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 ????

解释任何人......

提前致谢...

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

    }


}

3 个答案:

答案 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>