为什么spring不提供线程范围实现?

Vio*_*esa 7 spring multithreading scope

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

Sot*_*lis 12

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

现有的bean作用域在此处的文档中定义.

独生子

  • (默认)将每个Spring IoC容器的单个bean定义范围限定为单个对象实例.

原型

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

请求

  • 将单个bean定义范围限定为单个HTTP请求的生命周期; 也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的.仅在具有Web感知功能的Spring环境中有效ApplicationContext.

会议

  • 将单个bean定义范围限定为HTTP会话的生命周期.仅在Web感知Spring ApplicationContext的上下文中有效.全球

应用

  • 将单个bean定义范围限定为a的生命周期ServletContext.仅在具有Web感知功能的Spring环境中有效 ApplicationContext.

的WebSocket

  • 将单个bean定义范围限定为a的生命周期WebSocket.仅在具有Web感知功能的Spring环境中有效ApplicationContext.

然后文档做了说明

从Spring 3.0开始,线程范围可用,但默认情况下未注册.有关更多信息,请参阅文档 SimpleThreadScope.

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

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

此线程范围实现使用a ThreadLocal来存储bean.您无法Thread在Java中检测到结束/死亡,因此Spring IOC容器无法明确知道何时从中删除Bean ThreadLocal并调用生命周期方法的任何结尾.那么责任落在开发者身上.

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

  • 我没有完全理解你的答案,你能进一步解释一下吗?你说我们无法检测线程结束但为什么它是一个问题?如果IOC容器创建一个实例并将其放到该线程的ThreadLocal存储中,那么它可以将其移交给线程,并且每当该线程死亡时,线程本地存储上的对象将被垃圾收集,是不是正确?那么为什么DI容器应该关心线程的生命周期,它可以只注入对象并将其移除.我在这里错过了什么? (2认同)

M. *_*num 6

实际上它确实提供了一个线程范围,因为Spring 3.0.您可能需要自己注册,而不是开箱即用.

请参阅https://jira.springsource.org/browse/SPR-2581