为什么Spring不提供线程范围实现? 有没有人在Web应用程序上下文中使用Spring的线程范围bean? 应该有一个标准的,清晰的描述如何做到这一点! (SpringByExample有一个解决方案 - 我没有测试它 - 但它还不是主流。)
答案 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。您可能需要自己注册,而不是开箱即用。
答案 2 :(得分:2)
在Web应用程序上下文中,您可以使用与使用线程范围大致相同的请求范围。为服务器接收的每个请求创建一个请求范围的bean,并在请求完成时将其丢弃。
考虑线程可能在服务器上合并,这可能是Spring上没有线程范围的原因
请查看请求范围:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html