1

私はSpring Beanスコープに関するチュートリアルを読んで、BeanスコープがSpringコンテナである場合、ステートメントprototypeごとに新しいオブジェクトを作成することに言及しました。context.getBean("id")スコープを指定すると、ステートメントを2回以上singleton書いてもオブジェクトが1つだけ作成されます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" では、同じハッシュコードを出力している理由を与えました????

誰か説明...

前もって感謝します...

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

    }


}
4

3 に答える 3

0

問題はJarファイルにあります...以前はSpring 2.5 jarを使用していましたが、同じように印刷hashCode されましたが、後でjarを変更しました.Spring 3.0関連のjarを追加しました.正しい出力を取得しています..

于 2013-01-30T10:56:45.580 に答える
0

hashCodeこれは、personモデルでオーバーライドしたためです。

@Override
public int hashCode() {
  return name.hashCode();

あなたは実行します:

Person p=(Person)con.getBean("person");
Person q=(Person)con.getBean("person");

ただし、 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ます。

2 つの参照が同じオブジェクト インスタンスを指しているかどうかを確認するために、ハッシュ コードを使用しないでください。代わりにそれらを直接比較します。

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 に答える