2013-02-04 7 views
7

私は以下のようなシナリオに遭遇しました。複数スレッドにわたるSpring Bean参照

MyBean - XML構成で定義されています。

MyBeanを複数のスレッドに挿入する必要があります。 しかし、私の要件は: 1)2つの異なるスレッドで取得された参照は異なるはずです 2)しかし、私は単一のスレッドから何回Beanを取得しても同じ参照を取得する必要があります。

例:

Thread1 { 

    run() { 
     MyBean obj1 = ctx.getBean("MyBean"); 
     ...... 
     ...... 
     MyBean obj2 = ctx.getBean("MyBean"); 
    } 
} 

Thread2 { 

    run(){ 
     MyBean obj3 = ctx.getBean("MyBean"); 
    } 
} 

だから、基本的にはobj1 == obj2しかしobj1 != obj3

答えて

10

SimpleThreadScopeという名前のカスタムスコープを使用できます。

Springドキュメントから:Spring 3.0のよう

、スレッドスコープが利用可能ですが、デフォルトで に登録されていません。詳細については、 SimpleThreadScopeのドキュメントを参照してください。これを登録する方法や他のカスタムスコープを に追加する方法については、3.5.5.2, “Using a custom scope”を参照してください。

ここ

SimpleThreadScopeスコープを登録する方法の例:

Scope threadScope = new SimpleThreadScope(); 
beanFactory.registerScope("thread", threadScope); 

その後、あなたはあなたのBeanの定義でそれを使用することができます:

<bean id="foo" class="foo.Bar" scope="thread"> 

あなたはまた、行うことができますスコープ登録申告:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/aop 
      http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> 

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

    <bean id="foo" class="foo.Bar" scope="thread"> 
     <property name="name" value="bar"/> 
    </bean> 

</beans> 
2

あなたが必要と何が新しいスレッドローカルカスタムスコープです。独自に実装することも、use the one hereを実装することもできます。

カスタムスレッドスコープモジュールは、 スレッドスコープBeanのカスタムスコープ実装です。 Beanの要求ごとに、同じスレッドの同じインスタンスが に返されます。

関連する問題