Spring:`RequestScope` 与 `RequestContextHolder`
Spring: `RequestScope` vs `RequestContextHolder`
我正在编写一个 Spring 引导服务,并希望包含某种形式的 RequestContext
可供控制器使用,这些控制器可能会存储经过身份验证的用户和请求 ID 等内容。但是,我看到了多种方法:
- 使用一个
@RequestScope
bean
- 使用
ServletRequest.setAttribute
- 使用Spring
RequestContextHolder
这些方法之间的权衡是什么?
从广义上讲,RequestScope
是 Spring 神奇的 方式。它在内部使用 RequestContextHolder
,而 RequestContextHolder
又依赖于 ServletRequest.setAttribute
。
换句话说,Spring 方式 是恕我直言 RequestScope
。如果您更喜欢限制 Spring 注释的魔力,RequestContextHolder
是有意义的。
最后,ServletRequest.setAttribute
仍然是较低级别,如果您希望代码与非 Spring 应用程序兼容,则应主要使用它。
此外,对于前两种方式,Spring 使用线程范围的对象来存储对请求上下文的引用,这允许程序员即使在没有明确接收请求的方法中也可以访问 bean对象。
我正在编写一个 Spring 引导服务,并希望包含某种形式的 RequestContext
可供控制器使用,这些控制器可能会存储经过身份验证的用户和请求 ID 等内容。但是,我看到了多种方法:
- 使用一个
@RequestScope
bean - 使用
ServletRequest.setAttribute
- 使用Spring
RequestContextHolder
这些方法之间的权衡是什么?
从广义上讲,RequestScope
是 Spring 神奇的 方式。它在内部使用 RequestContextHolder
,而 RequestContextHolder
又依赖于 ServletRequest.setAttribute
。
换句话说,Spring 方式 是恕我直言 RequestScope
。如果您更喜欢限制 Spring 注释的魔力,RequestContextHolder
是有意义的。
最后,ServletRequest.setAttribute
仍然是较低级别,如果您希望代码与非 Spring 应用程序兼容,则应主要使用它。
此外,对于前两种方式,Spring 使用线程范围的对象来存储对请求上下文的引用,这允许程序员即使在没有明确接收请求的方法中也可以访问 bean对象。