Spring bean引用跨多个线程

时间:2013-02-04 14:52:03

标签: java multithreading spring dependency-injection

我遇到了如下情况:

MyBean - 在XML配置中定义。

我需要将MyBean注入多个线程。 但我的要求是: 1)在两个不同的线程中检索的引用应该是不同的 2)但我应该得到相同的引用,无论我从单线程中检索bean多少次。

例如:

Thread1 {

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

Thread2 {

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

基本上obj1 == obj2obj1 != obj3

2 个答案:

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

答案 1 :(得分:2)

您需要的是新的线程本地自定义范围。您可以实现自己的或use the one here

  

自定义线程范围模块是一个自定义范围实现   提供线程范围的bean。 bean的每个请求都将返回   同一个线程的相同实例。