Java Bean - 通过原型范围需要相同的对象

时间:2016-08-05 19:25:33

标签: java spring multithreading hashmap

对于线程安全问题,我们将单例bean转换为原型。但在一个场景中,我们仍然需要同一个对象(在该线程中)用于多个地图项。但是原型给出了不同的对象(当然它会)。我不确定如何实现它。

例如在下面的豆A中,B1和B2被引用两次(它们是原始豆)。每次使用相同的线程创建新的B1和B2对象。我想在同一个线程中只有一个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>

2 个答案:

答案 0 :(得分:3)

如果您正在开发Web应用程序,则可以考虑在单个线程中处理http请求时使用请求范围。如果没有,您可能需要注册SimpleThreadScope并使用它来声明您的bean。

答案 1 :(得分: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>