2017-02-11 95 views
0

在从处理请求的主线程创建的单独线程中异步使用具有请求或会话作用域的bean是否安全?Spring中的请求和会话bean生命周期

我想知道如果请求完成或会话过期并且子线程仍处于活动状态将会发生什么情况。春天会破坏这个bean,还是知道这个bean还在使用中。

我只是在春天熟悉bean的范围和生命周期。请原谅我的noobness。

回答

1

简短回答:这是不安全的,复制您需要做的异步处理信息。

长答案:Spring使用代理实现请求范围的bean。这个代理就是注入你的类的东西。每当你在这个代理上调用一个方法时,Spring将查找对当前请求有效的实际bean(使用ThreadLocal机制),然后将该调用委托给正确的实例。

只要请求线程完成,关联的请求范围的bean就会被清除(以免下一次同一个线程用于不同的请求时)。它们没有被“销毁”,但是因为你只是间接引用它们(通过被注入的代理),它们实际上是无法访问的,并且会被垃圾收集。

如果请求完成后,您尝试调用代理中的其中一个方法,并且没有有效的请求,Spring将会抛出异常。

+0

感谢您的详细解释! – rhino2rhonda