2016-08-05 12 views
0

スレッドセーフの問題が発生したため、シングルトンBeanをプロトタイプとして変換しています。しかし、1つのシナリオでは、複数のマップ項目に対して同じオブジェクト(スレッド内に)が必要です。しかし、プロトタイプは別のオブジェクトを与えています(もちろんそうです)。私はそれを達成する方法がわかりません。Java Bean - プロトタイプスコープで同じオブジェクトが必要

Bean Aの下では、B1とB2が2回参照されます(これはprototye beanです)。同じスレッドで毎回新しいB1およびB2オブジェクトが作成されています。私はそれを2回参照したにもかかわらず、同じスレッド内に1つのB1とB2オブジェクトしか必要としません。 B1とB2がシングルトンの場合は、スレッド間で同じであるはずはありません。あなたはそれを達成する方法についていくつか考えてください。

<bean id="A" class="mypackage.foo" scope="prototype"> 
<property name="myMap"> 
    <bean class="org.springframework.beans.factory.config.MapFactoryBean"> 
    <property name="targetMapClass"> 
     <value>java.util.HashMap</value> 
    </property> 
    <property name="sourceMap"> 
    <map> 
     <entry key="KEY1"> 
     <ref bean="B1"></ref> 
     </entry> 
     <entry key="KEY2"> 
     <ref bean="B2"></ref> 
     </entry> 
     <entry key="KEY3"> 
     <ref bean="B1"></ref> 
     </entry> 
     <entry key="KEY4"> 
     <ref bean="B2"></ref> 
     </entry> 
    </map> 
    </property> 
    </bean> 
</property> 

答えて

3

Webアプリケーションを開発している場合は、単一のスレッドでHTTPリクエストを処理した場合、あなたはリクエストスコープを使用して検討することができます。そうでない場合は、SimpleThreadScopeを登録し、それを使用してBeanを宣言することができます。

+0

優れた提案。私はシンプルスレッド用のカスタムBeanを追加し、それを使用しました。ありがとうalot –

+0

ちょうどきれいにあなたのスレッドスコープをきれいにしてください。スレッドが再利用される場合は、「古い」データに実行される可能性があります。 –

+0

アドバイスをいただき、ありがとうございました。私は二重チェックします。 –

0

Apokralipsa suugestionに基づいて、Beanの下に追加され、問題を解決するスコープとしてスレッドが使用されました。

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> 
     <property name="scopes"> 
      <map> 
       <entry key="thread"> 
        <bean class="org.springframework.context.support.SimpleThreadScope"/> 
       </entry> 
      </map> 
     </property> 
    </bean> 
関連する問題