【发布时间】:2015-08-30 18:37:22
【问题描述】:
在我们的项目中,我们使用 Spring 请求范围的 bean。现在我们需要支持异步请求,并且请求范围的 bean 不适用于子线程。我知道RequestContextFilter 并且它是对异步的“支持”,但似乎RequestContextFilter 期望主线程等待子线程完成,这对我们来说并非如此。我们的主线程在使用@Async 注释生成新线程后立即返回,DispatcherServlet 清除了RequestContextHolder。因此,当子线程到达需要请求范围 bean 的地步时,@Autowired 会失败。
我也知道SimpleThreadScope,但它不会清理线程本地属性,并且在线程池的情况下,不仅使用起来很危险,而且完全没用。
我需要的是自定义范围。到目前为止,我已经找到了 3 个有用的示例,但它们都存在不足,因为它们作为自定义范围的一部分实例化的 bean 是没有任何依赖关系的普通 POJO。不用说,这在现实生活中的应用程序中是不存在的。谁能建议一种方法来实例化具有 @Autowired 依赖于其他范围的 bean 的自定义范围 bean?
到目前为止我发现了什么:
【问题讨论】:
-
web 层的异步支持和只是拍
@ASync是不同的事情。相反,您想使用DefferedResult或Callable并从控制器返回。这样您就可以使用 servlet 规范的异步功能。使用@Async时,您基本上会得到一个后台线程,无法访问请求范围的变量。 -
@M.Deinum 不,我们不想使用控制器中的
DeferredResult或Callable,因为我们的客户无法处理。我们的要求在上述方式中是独一无二的。 -
那为什么还要使用请求范围的bean呢?只需将所需的东西作为方法参数传递,不需要只会使事情复杂化的自定义范围......
-
传递十几个东西作为方法参数?不用了,谢谢。即使将它们包裹在一个物体中并通过也是令人反感的设计。
-
这是一种观点,恕我直言,滥用作用域是有问题的。您已经拥有该对象,因此您已经在其中设置了一些东西,如果将其作为单个对象而不是使用范围传递,那会更糟。
标签: spring scope httprequest autowired thread-local