如何使用自定义作用域和@Autowired依赖项实例化Spring bean?

时间:2015-06-15 09:55:36

标签: spring scope httprequest autowired thread-local

在我们的项目中,我们使用Spring请求范围的bean。现在我们需要支持异步请求,并且请求范围的bean不适用于子线程。我知道RequestContextFilter并且它是异步的“支持”但似乎RequestContextFilter期望主线程等待子线程完成,这对我们来说并非如此。我们的主线程在使用@Async注释生成新线程后立即返回,DispatcherServlet清除RequestContextHolder。因此,当子线程到达需要请求范围的bean时,@Autowired会失败。

我也知道SimpleThreadScope但它没有清除线程局部属性,并且在线程池中,不仅使用起来很危险,而且完全无用。

我需要的是自定义范围。到目前为止,我已经找到了3个有用的例子,但是所有这些例子都不足之处在于它们作为自定义范围的一部分实例化的bean是没有任何依赖关系的普通POJO。毋庸置疑,这在现实生活中并不存在。任何人都可以建议一种方法来实例化对其他范围的bean有@Autowired依赖关系的自定义范围bean吗?

到目前为止我发现了:

https://github.com/spring-by-example/spring-by-example/tree/master/modules/sbe-thread-scope/src/main/java/org/springbyexample/bean/scope/thread

https://github.com/billkoch/spring-async-mdc

Spring Bean Custom Scope JMS

1 个答案:

答案 0 :(得分:1)

继续other question's answer这里的讨论......

  

请参阅Spring Documentation about scoped beans as dependencies

  

我指的是链接指向的<aop:scoped-proxy/>。每次引用自动装配字段时,都会调用自定义范围的get()方法以根据某些条件查找实例。

  

我理解我可以查找依赖项(虽然不确定如何,范围不是bean,也许我需要在实例化期间传递应用程序上下文?)。我不明白的是如果那些被标记为@Autowired的那些依赖项注入我的bean?或者你是说自定义范围的bean不应该有@Autowired依赖项?

自动运作; Spring为bean注入一个代理,并在该bean的每个方法调用上调用scope.get(),在当前调用的上下文中返回您想要的特定实例。

查看AbstractRequestAttributesScope以了解它是如何工作的(在这种情况下,从HTTP请求中获取实例,如果不存在,则创建它)。

因此,您的代码会在代理上调用foo();框架调用范围以获取所需的实例,然后在该实例上调用foo()

您要调用的公开方法必须位于接口上或未声明为final