为什么spring不提供线程作用域实现?

voj3qocg  于 2023-01-19  发布在  Spring
关注(0)|答案(4)|浏览(152)

为什么Spring不提供线程作用域实现?有人在Web应用程序上下文中使用过Spring的线程作用域bean吗?应该有一个标准的、清晰的描述来说明如何做到这一点!(SpringByExample有一个解决方案--我没有测试它--但它还不是主流。)

8fq7wneg

8fq7wneg1#

Spring确实提供了线程作用域,但默认情况下不注册。
现有的bean范围在文档中定义,如下所示。

    • 单例**
  • (默认)将单个bean定义限定为每个Spring IoC容器的单个对象示例。
    • 原型**
  • 将单个bean定义的范围限定为任意数量的对象示例。
    • 请求**
  • 将单个bean定义的范围限定为单个HTTP请求的生命周期;也就是说,每个HTTP请求都有自己的bean示例,该示例是在一个bean定义的后面创建的,只在Web感知的Spring ApplicationContext环境中有效。
    • 届会**
  • 将单个bean定义的范围限定为HTTP会话的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。global
    • 应用程序**
  • 将单个bean定义的范围限定为ServletContext的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。
    • 网络套接字**
  • 将单个bean定义的范围限定为WebSocket的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。

然后文档会做一个注解
从Spring 3.0开始,线程作用域是可用的,但默认情况下没有注册。更多信息,请参见SimpleThreadScope的文档。
注意,与原型作用域类似,线程作用域
[SimpleThreadScope]不清除与其关联的任何对象。
这个线程作用域实现使用ThreadLocal来存储bean。你不能检测Thread在Java中的结束/死亡,所以Spring IOC容器不能显式地知道什么时候从ThreadLocal中删除bean,以及调用任何生命周期结束的方法。这个责任就落在了开发人员身上。
在使用此作用域时要小心。例如,在线程池上下文中,可能已经在池的重用线程之一中创建并存储了Bean。根据您的用例,这可能是不正确的行为。

bqucvtff

bqucvtff2#

实际上,从Spring 3.0开始,它确实提供了一个线程作用域。您可能需要自己注册它,而不是开箱即用。
参见https://jira.springsource.org/browse/SPR-2581

nimxete2

nimxete23#

在Web应用程序上下文中,可以使用与使用线程作用域大致相同的请求作用域。将为服务器接收到的每个请求创建一个请求作用域Bean,并在请求完成时将其丢弃。
考虑到服务器上的线程可能是池化的,这可能就是Spring上没有线程作用域的原因
查看请求范围:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

r6vfmomb

r6vfmomb4#

正如在接受的答案中提到的,SimpleThreadScope在线程退出时不进行对象清理。然而,Spring的文档指向Spring by Example实现,这会处理它-请查看ThreadScope
来自Spring的自定义作用域注册示例(示例website):

<bean id="threadCounter" 
      class="org.springbyexample.bean.scope.thread.Counter" 
      scope="thread" />

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="thread">
                <bean class="org.springbyexample.bean.scope.thread.ThreadScope"/>
            </entry>
        </map>
    </property>
</bean>

然后将其用作:@Scope("thread")
重要提示-为了运行销毁回调,必须将Runnable Package 在ThreadScopeRunnable中。

相关问题