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并将其存储在其中一个池的重用线程中.根据您的使用情况,可能是不正确的行为.