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

时间:2014-02-04 12:19:00

标签: multithreading spring scope

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

3 个答案:

答案 0 :(得分:12)

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

现有的bean范围在文档here中定义。

  

<强>单

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

原型

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

请求

     
      
  • 将单个bean定义范围限定为生命周期   单个HTTP请求;也就是说,每个HTTP请求都有自己的实例   在单个bean定义的后面创建的bean。只有效   在Web感知的Spring ApplicationContext的上下文中。
  •   
     

<强>会话

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

<强>应用

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

<强>的WebSocket

     
      
  • 将单个bean定义范围限定为WebSocket的生命周期。只要   在网络感知的Spring [{1}}。
  • 的上下文中有效   

文档然后记下

  

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

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

  

[ApplicationContext]不会清除与之关联的任何对象。

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:2)

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

考虑线程可能在服务器上合并,这可能是Spring上没有线程范围的原因

请查看请求范围:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html