2013-02-04 19 views
7

Ben aşağıda bir senaryo rastlamak:Bahar fasulye referanslar

MyBean - XML ​​Yapılandırma tanımlanmıştır.

MyBean'ı birden çok iş parçacığına enjekte etmem gerekiyor. Ancak benim gereksinimlerim: 1) İki farklı başlıkta alınan referans farklı olmalıdır 2) Ancak, tek bir iş parçacığından fasulyeyi kaç kez aldığımdan bağımsız olarak aynı referansı almalıyım.

Örn:

Thread1 { 

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

Thread2 { 

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

Yani Temelde obj1 == obj2 ama

cevap

10

SimpleThreadScope adlı özel kapsamı kullanabilirsiniz. Spring belgelerine

: Spring 3.0 itibariyle

, bir iş parçacığı kapsamı mevcuttur, ancak varsayılan olarak kayıtlı değil. Daha fazla bilgi için, SimpleThreadScope belgelerine bakın. Bu veya herhangi bir özel kapsamı kaydettirme yönergeleri için bkz. Bölüm 3.5.5.2, “Using a custom scope”. İşte

SimpleThreadScope kapsamını kayıt nasıl bir örnek: Ayrıca yapabilirsiniz

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

: Sonra

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

, kendi fasulye tanımında kullanmak mümkün olacak Kapsam kaydının bildirilmesi:

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

Ne gerektiren yeni bir parçacığı yerel özel kapsam olduğunu obj1 != obj3. Kendi veya use the one here'u uygulayabilirsiniz.

Özel Thread Scope modülü, iş parçacığı kapsamındaki fasulye sağlayan için özel bir kapsam uygulamasıdır. Fasulye için her istek, aynı iplik için aynı örnek geri dönecektir.