Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaBean-需要通过prototype作用域使用相同的对象_Java_Spring_Multithreading_Hashmap - Fatal编程技术网

JavaBean-需要通过prototype作用域使用相同的对象

JavaBean-需要通过prototype作用域使用相同的对象,java,spring,multithreading,hashmap,Java,Spring,Multithreading,Hashmap,对于出现的线程安全问题,我们将单例bean转换为原型。但在一个场景中,我们仍然需要为多个映射项使用相同的对象(在该线程中)。但原型给出了不同的对象(当然会)。我不知道如何实现它 例如,在下面的bean A中,B1和B2被引用两次(这是prototye bean)。每次在同一线程中创建新的B1和B2对象。我只希望在同一线程中有一个B1和B2对象,即使我引用了它两次。若B1和B2是单态,那个么在al线程上是相同的,这是不应该发生的。你能提供一些如何实现这一目标的想法吗 <bean id="A"

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

例如,在下面的bean A中,B1和B2被引用两次(这是prototye bean)。每次在同一线程中创建新的B1和B2对象。我只希望在同一线程中有一个B1和B2对象,即使我引用了它两次。若B1和B2是单态,那个么在al线程上是相同的,这是不应该发生的。你能提供一些如何实现这一目标的想法吗

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

java.util.HashMap

如果你正在开发一个Web应用程序,如果你在一个线程中处理一个HTTP请求,你可以考虑使用请求范围。如果不是,您可能需要登记并使用它来声明bean。

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

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

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


非常好的建议。我为simplethread范围添加了自定义bean并使用了它。非常感谢,一定要好好清理一下你的threadscope。如果线程被重用,您可能会遇到“旧”数据。感谢Martin的建议。我会再检查一遍。很好的建议。我为simplethread范围添加了自定义bean并使用了它。非常感谢,一定要好好清理一下你的threadscope。如果线程被重用,您可能会遇到“旧”数据。感谢Martin的建议。我会再检查一遍。