2016-08-05 45 views
0

Für Threadsicherheitsproblem aufgetreten, konvertieren wir unsere Singleton-Bohnen als Prototyp. Aber in einem Szenario brauchen wir immer noch dasselbe Objekt (mit diesem Thread) für mehrere Kartenelemente. Aber der Prototyp gibt ein anderes Objekt (natürlich wird es das). Ich bin mir nicht sicher, wie ich es erreichen soll.Java Bean - Benötigen Sie dasselbe Objekt über den Prototyp-Bereich

Für z.B. In der Folge werden die Bohnen A, B1 und B2 zweimal bezeichnet (das sind die Proto-Bohnen). Jedes neue B1- und B2-Objekt wird jedes Mal mit demselben Thread erstellt. Ich möchte nur ein B1- und B2-Objekt im selben Thread, obwohl ich es zweimal referenziert habe. Wenn B1 und B2 Singleton ist, wird es über alle Threads hinweg gleich sein, was nicht passieren sollte. Könnten Sie mir bitte eine Idee geben, wie Sie dies erreichen können?

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

Antwort

3

Wenn Sie eine Web-Anwendung entwickeln, können Sie mit Hilfe Anfrage Umfang prüfen, ob Sie eine HTTP-Anforderung in einem einzigen Thread behandeln. Wenn nicht, möchten Sie vielleicht die SimpleThreadScope registrieren und diese verwenden, um Ihre Beans zu deklarieren.

+0

Ausgezeichneter Vorschlag. Ich habe eine benutzerdefinierte Bean für den Simplethread-Bereich hinzugefügt und diese verwendet. Vielen Dank –

+0

Seien Sie einfach sicher, Ihr threadscope nett zu säubern. Wenn die Threads wiederverwendet werden, können Sie auf "alte" Daten stoßen. –

+0

Danke Martin für den Rat. Ich werde es überprüfen. –

0

Basierend auf Apokralipsa Suugestion, unten Bohne hinzugefügt und dann den Thread als Bereich, der das Problem gelöst.

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