如何使用自定义范围和@Autowired依赖项实例化 Spring Bean



在我们的项目中,我们使用 Spring 请求范围的 bean。现在,我们要求支持异步请求,并且请求作用域的 bean 不适用于子线程。我知道 RequestContextFilter 并且它"支持"异步,但似乎RequestContextFilter希望主线程等待子线程完成,而我们的情况并非如此。我们的主线程在使用@Async注释生成新线程后立即返回,DispatcherServlet清除RequestContextHolder。因此,当子线程达到需要请求作用域 Bean 的程度时,@Autowired失败。

我也知道 SimpleThreadScope,但它不会清理线程本地属性,并且在线程池情况下,不仅使用起来很危险,而且完全无用。

我需要的是一个自定义范围。到目前为止,我已经找到了 3 个有用的示例,但它们都不足,因为它们作为自定义范围的一部分实例化的 bean 是没有任何依赖项的普通 POJO。不用说,这在现实生活中是不存在的。任何人都可以建议一种实例化自定义作用域 Bean 的方法,这些 bean 对其他作用域的 bean 具有@Autowired依赖关系?

到目前为止我发现的:

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

春豆自定义范围 JMS

从另一个问题的答案继续讨论这里...

请参阅 Spring 文档,了解作用域内 Bean 作为依赖项。

.

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

.

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

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

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

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

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

最新更新