Multithreading 为什么';spring是否提供线程作用域实现?

Multithreading 为什么';spring是否提供线程作用域实现?,multithreading,spring,scope,Multithreading,Spring,Scope,为什么Spring不提供线程作用域实现? 有人在web应用程序上下文中使用过Spring的线程范围bean吗? 应该有一个标准,明确的描述如何做到这一点! (SpringByExample有一个解决方案——我没有测试它,但它还不是主流。)在web应用程序上下文中,您可以使用与使用线程作用域大致相同的请求作用域。为服务器接收到的每个请求创建一个请求范围bean,并在请求完成时丢弃 考虑到线程可能集中在服务器上,这可能就是为什么Spring上没有线程作用域的原因 看看请求范围:Spring确实提供了

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

在web应用程序上下文中,您可以使用与使用线程作用域大致相同的请求作用域。为服务器接收到的每个请求创建一个请求范围bean,并在请求完成时丢弃

考虑到线程可能集中在服务器上,这可能就是为什么Spring上没有线程作用域的原因


看看请求范围:

Spring确实提供了一个线程范围,但默认情况下它没有注册

现有bean范围在文档中定义

单身人士

  • (默认)将单个bean定义的范围限定为每个SpringIOC容器的单个对象实例
原型

  • 将单个bean定义的范围限定为任意数量的对象 实例
请求

  • 将单个bean定义的范围限定到 单个HTTP请求;也就是说,每个HTTP请求都有自己的实例 在单个bean定义的后面创建的bean。唯一有效 在web感知Spring的上下文中
    ApplicationContext
会话

  • 将单个bean定义限定为HTTP会话的生命周期。 仅在支持web的Spring应用程序上下文的上下文中有效。 全球的
应用程序

  • 将单个bean定义的范围限定到
    ServletContext
    的生命周期。仅在web感知Spring的上下文中有效
    ApplicationContext
websocket

  • 将单个bean定义的范围限定到
    WebSocket
    的生命周期。只有 在支持web的Spring
    ApplicationContext
    上下文中有效
然后,文档会做一个注释

从Spring3.0开始,线程作用域可用,但尚未注册 默认情况下。有关更多信息,请参阅的文档

注意,与原型范围类似,线程范围

[
SimpleThreadScope
]不会清理与之关联的任何对象

此线程作用域实现使用
ThreadLocal
存储bean。 您无法检测Java中的
线程
结束/死亡,因此Spring IOC容器无法明确知道何时从
线程本地
中删除bean并调用任何生命周期结束方法。这个责任就落在了开发者身上


使用此范围时要小心。例如,在线程池上下文中,一个bean可能已经被创建并存储在池的一个重用线程中。根据您的用例,这可能是不正确的行为。

实际上,自Spring 3.0以来,它提供了一个线程作用域。您可能需要自己注册,而不是直接使用


请参见

您的答案是针对不同的问题:(.请求作用域bean不会自动连线进行异步服务器端处理。如果需要批处理作业或任何其他后台处理,则不能使用spring bean,因为自动连线请求作用域bean时会失败。您曾询问在Web应用程序上下文中使用线程作用域bean,这正是我想要的线程作用域与请求作用域并不完全相同,它们“大致相同”。也许我在这个问题上不够清楚。无论如何,谢谢你的回答!记住,线程可能在服务器上被池化,这可能就是为什么Spring上没有线程作用域的原因。是的,你是对的!这可能是一个原因,但为了实现线程作用域行为,可以对线程状态进行清理。如果你说的是org.springframework.context.support.SimpleThreadScope,它不做任何清理,而且不可用。它基本上是一个线程池范围…,即werid:)SpringByExample有一个可以工作的实现,但我还没有尝试。对于一个tomcat应用程序,它在部署新版本时被终止,然后在创建应用程序时生成bean(假设线程池只是tomcat为web请求提供服务的线程池),那么这些bean就像服务bean一样,生命周期==应用生命周期==直到tomcat生存?所以工作得很好-不是单例或web会话范围,但如果方法本身是线程安全的,冲突就更少了我没有完全理解你的答案,你能进一步解释吗?你说我们无法检测到线程结束,但为什么这是个问题m?如果IOC容器创建一个实例并将其放入该线程的ThreadLocal存储中,那么它可以将其交给该线程,并且每当该线程死亡时,线程本地存储中的对象都将被垃圾收集,不是吗?那么为什么DI容器应该关心线程的生命周期,它可以只注入该对象把它交给我,我还缺什么?