在服务中访问请求范围的 Bean

Access a request scoped Bean in Service

我有一个常规 bean,它是 (a) @Scope("request") 或 (b) 通过过滤器/拦截器放置在 HttpServletRequest 中。

如何在 @Service 中访问这个 bean,这是一种应用程序范围的单例?

这是因为我有一个自定义对象 RequestContext,其中包含一些请求元数据(主要是来自自定义 httpHeaders 的信息)。为了知道,我将这个对象作为参数传递给每个服务的每个方法,这是很多样板代码。

只要将 bean 声明为请求范围,Spring 将处理其余部分。

@Bean
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public RequestContext requestContext() {
    return new RequestContext();
}

以通常的方式访问 bean,只需自动装配它。

@Autowired
private RequestContext requestContext;

服务 bean 将是一个单例,但在幕后,RequestContext bean 附加到线程,因此每次调用方法时您将获得不同的实例。

注意您必须有一个 Web 上下文,即 运行 一个 WEB SERVER/WEB APP