2016-07-20 3 views
1

ので、私は、このクラスの例があります。静的クラス変数の値をSpringに保持する方法を教えてください。

public class Test { 

    private static int idCounter; 
    private int id; 

    Test() { 
     id=++idCounter; 
    } 

    public void getId() { 
     System.out.printf("This id is %s",this.id); 
    } 
} 

そしてbeans.xmlのコンフィグ:私はArrayListのを作るしようとすると、

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

は今、静的変数は毎回リセットされます。

for (int i=0;i<9;i++) { 
    arrayList.add(context.getBean("test"); 
    arrayList.get(i).getId(); 
} 

「これは1です」というメッセージは、arrayList内のすべてのオブジェクトに対して表示されます。静的変数がグローバルな値を保持するようにするにはどうすればよいですか?

+1

デフォルトスコープはシングルトンなので、毎回同じBean/Objectを取得するため、同じ値が表示されます。スコープをプロトタイプに設定してみてください – Sarief

+1

私は疑問に思っています:なぜ 'getBean(" test ")'の代わりに 'getBean(" triangle ")'を使用しますか? – Andremoniy

答えて

1

デフォルトでは、Spring Beanはシングルトンスコープを持ちます。つまり、各リクエストは同じBeanのインスタンスを返します。必要なのはプロトタイプスコープです:

<bean id="myBean" class="com.test.MyClass" scope="prototype"/> 
2

ここで起こっていることは、あなたの考えていることではありません。 staticメンバ変数はリセットされません。 Test beanのインスタンスは1つしかなく、ループ内で同じTest beanを10回検索しています。

デフォルトでSpring Beanはシングルトンスコープを持ちます。つまり、SpringはBeanのインスタンスを1つだけ作成します。これは、注入または参照するたびに使用されます。あなたがするたびに作成された新しいインスタンスをしたい場合は、代わりにデフォルトのシングルトンスコープの豆のプロトタイプのスコープを与える:あなたはXMLを使用してのSpring Beanを構成した場合アンドリューLogvinovは彼の答えに示したよう

@Scope("prototype") 
public class Test { 
    // ... 
} 

、その後、それを行います。 scope属性を追加します。

<bean id="test" class="com.Test" scope="prototype"/> 

詳細については、SpringフレームワークリファレンスドキュメントでBean scopesを参照してください。

+0

彼はxmlを使っていますが、xmlでも投稿できますか? – Sarief

0

あなたはtest IDをごBeanを宣言した:

<beans> 
    <bean id="test" class="com.Test"/> 
</beans> 

しかし、その後、あなたは、いくつかのインスタンスID triangleを使用して別のBeanを取得:

context.getBean("triangle") 

だから、私が思う、これは単なるタイプミスです-error:静的IDカウンタを持たない別のBeanのインスタンスを取得します。私が正しくない場合は、コードを確認して質問を更新してください。

0

Jesper's answerが正しい。これをシングルトンとして設定したので、クラスのインスタンスは1つだけです。コンストラクタは一度呼び出されます。

しかし、あなたが期待するよう、これは二つの理由から、それが動作しない場合があり、プロトタイプのスコープを使用することを修正しても一度:

  • ++演算子はスレッドセーフではありません、Is the pre-increment operator thread-safe?を参照してください。

  • カウンタの更新をスレッド間で見えるようにすることは何もありません。

あなたはそれがスレッドセーフインクリメントが可能と可視性の保証を提供し、このためにAtomicIntegerようなものを使用する必要があります。

関連する問題