为什么Spring不提供线程作用域实现?有人在Web应用程序上下文中使用过Spring的线程作用域bean吗?应该有一个标准的、清晰的描述来说明如何做到这一点!(SpringByExample有一个解决方案--我没有测试它--但它还不是主流。)
8fq7wneg1#
Spring确实提供了线程作用域,但默认情况下不注册。现有的bean范围在文档中定义,如下所示。
ApplicationContext
ServletContext
WebSocket
然后文档会做一个注解从Spring 3.0开始,线程作用域是可用的,但默认情况下没有注册。更多信息,请参见SimpleThreadScope的文档。注意,与原型作用域类似,线程作用域[SimpleThreadScope]不清除与其关联的任何对象。这个线程作用域实现使用ThreadLocal来存储bean。你不能检测Thread在Java中的结束/死亡,所以Spring IOC容器不能显式地知道什么时候从ThreadLocal中删除bean,以及调用任何生命周期结束的方法。这个责任就落在了开发人员身上。在使用此作用域时要小心。例如,在线程池上下文中,可能已经在池的重用线程之一中创建并存储了Bean。根据您的用例,这可能是不正确的行为。
SimpleThreadScope
ThreadLocal
Thread
bqucvtff2#
实际上,从Spring 3.0开始,它确实提供了一个线程作用域。您可能需要自己注册它,而不是开箱即用。参见https://jira.springsource.org/browse/SPR-2581
nimxete23#
在Web应用程序上下文中,可以使用与使用线程作用域大致相同的请求作用域。将为服务器接收到的每个请求创建一个请求作用域Bean,并在请求完成时将其丢弃。考虑到服务器上的线程可能是池化的,这可能就是Spring上没有线程作用域的原因查看请求范围:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
r6vfmomb4#
正如在接受的答案中提到的,SimpleThreadScope在线程退出时不进行对象清理。然而,Spring的文档指向Spring by Example实现,这会处理它-请查看ThreadScope。来自Spring的自定义作用域注册示例(示例website):
<bean id="threadCounter" class="org.springbyexample.bean.scope.thread.Counter" scope="thread" /> <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer"> <property name="scopes"> <map> <entry key="thread"> <bean class="org.springbyexample.bean.scope.thread.ThreadScope"/> </entry> </map> </property> </bean>
然后将其用作:@Scope("thread")重要提示-为了运行销毁回调,必须将Runnable Package 在ThreadScopeRunnable中。
@Scope("thread")
4条答案
按热度按时间8fq7wneg1#
Spring确实提供了线程作用域,但默认情况下不注册。
现有的bean范围在文档中定义,如下所示。
ApplicationContext
环境中有效。ServletContext
的生命周期。仅在Web感知SpringApplicationContext
的上下文中有效。WebSocket
的生命周期。仅在Web感知SpringApplicationContext
的上下文中有效。然后文档会做一个注解
从Spring 3.0开始,线程作用域是可用的,但默认情况下没有注册。更多信息,请参见
SimpleThreadScope
的文档。注意,与原型作用域类似,线程作用域
[
SimpleThreadScope
]不清除与其关联的任何对象。这个线程作用域实现使用
ThreadLocal
来存储bean。你不能检测Thread
在Java中的结束/死亡,所以Spring IOC容器不能显式地知道什么时候从ThreadLocal
中删除bean,以及调用任何生命周期结束的方法。这个责任就落在了开发人员身上。在使用此作用域时要小心。例如,在线程池上下文中,可能已经在池的重用线程之一中创建并存储了Bean。根据您的用例,这可能是不正确的行为。
bqucvtff2#
实际上,从Spring 3.0开始,它确实提供了一个线程作用域。您可能需要自己注册它,而不是开箱即用。
参见https://jira.springsource.org/browse/SPR-2581
nimxete23#
在Web应用程序上下文中,可以使用与使用线程作用域大致相同的请求作用域。将为服务器接收到的每个请求创建一个请求作用域Bean,并在请求完成时将其丢弃。
考虑到服务器上的线程可能是池化的,这可能就是Spring上没有线程作用域的原因
查看请求范围:http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html
r6vfmomb4#
正如在接受的答案中提到的,SimpleThreadScope在线程退出时不进行对象清理。然而,Spring的文档指向Spring by Example实现,这会处理它-请查看ThreadScope。
来自Spring的自定义作用域注册示例(示例website):
然后将其用作:
@Scope("thread")
重要提示-为了运行销毁回调,必须将Runnable Package 在ThreadScopeRunnable中。