在处理请求的主线程创建的单独线程中异步使用带有请求或会话范围的bean是否安全?
我想知道如果请求完成或会话过期且子线程仍处于活动状态会发生什么。春天会破坏豆子还是意识到豆子还在使用中。
我只是熟悉春天的豆子范围和生命周期。请原谅我的noobness。
答案 0 :(得分:1)
简短回答:它不安全,复制您进行异步处理所需的信息。
答案很长:Spring使用代理实现请求范围的bean。这个代理是注入你的类的东西。无论何时在此代理上调用方法,Spring都会查找对当前请求有效的实际bean(使用ThreadLocal
机制),然后将调用委托给正确的实例。
请求线程完成后,相关的请求范围bean将被清除(以便下次将相同的线程用于其他请求时不会干扰)。他们没有被销毁#34;但由于你只是间接引用它们(通过注入的代理),它们实际上是无法访问的并且会被垃圾收集。
如果在请求完成后你尝试调用代理上的一个方法并且没有有效的请求,Spring会抛出异常。