Spring:`RequestScope` 与 `RequestContextHolder`

Spring: `RequestScope` vs `RequestContextHolder`

我正在编写一个 Spring 引导服务,并希望包含某种形式的 RequestContext 可供控制器使用,这些控制器可能会存储经过身份验证的用户和请求 ID 等内容。但是,我看到了多种方法:

  1. 使用一个 @RequestScope bean
  2. 使用ServletRequest.setAttribute
  3. 使用SpringRequestContextHolder

这些方法之间的权衡是什么?

从广义上讲,RequestScope 是 Spring 神奇的 方式。它在内部使用 RequestContextHolder,而 RequestContextHolder 又依赖于 ServletRequest.setAttribute。 换句话说,Spring 方式 是恕我直言 RequestScope。如果您更喜欢限制 Spring 注释的魔力,RequestContextHolder 是有意义的。 最后,ServletRequest.setAttribute 仍然是较低级别,如果您希望代码与非 Spring 应用程序兼容,则应主要使用它。

此外,对于前两种方式,Spring 使用线程范围的对象来存储对请求上下文的引用,这允许程序员即使在没有明确接收请求的方法中也可以访问 bean对象。