【问题标题】:@Autowired HttpServletRequest vs passing as parameter - best practice@Autowired HttpServletRequest 与作为参数传递 - 最佳实践
【发布时间】:2018-07-12 11:43:06
【问题描述】:

假设我们定义了一个只有@Controller注解的控制器类。

在类内部,我们定义了private @Autowired HttpServletRequest request;变量。

Spring 控制器是单例的。当我们在 Web 应用程序中将 HttpServletRequest 定义为 @Autowired 时,会不会有问题?

我从一个网站上读到,即使它是@Autowired,它也只是为线程变量注入了一个代理。

这是真的吗?在多线程环境中,我们可以使用@Autowired 或将HttpServletRequest 作为参数传递给控制器​​类中的每个方法是正确的方法吗?

一些网站说这是一个问题并建议作为参数传递,而很少有人说这将是一个问题。

我不明白哪个是正确的。

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

    两者都可以。
    @Autowired HttpServletRequest 和作为参数传递是一回事。

    在将HttpServletRequest 传递给响应@RequestMapping 函数的调用方法之前,Spring 将HttpServletRequest 存储到ThreadLocal 类型变量中。

    ThreadLocal 变量是一个线程安全映射,它将HttpServletRequest 保存在当前线程上下文中。 @Autowired HttpServletRequest 代理 bean 从该 ThreadLocal 变量中获取正确的请求。

    【讨论】:

    • 非常感谢您的确认
    • 您能否参考支持您的thread-safe 解释的文档更新您的答案?
    • @Raf,这也可以通过查看org.springframework.web.context.support.WebApplicationContextUtils.RequestObjectFactory开头的源代码来确认。
    • 现在我想知道它如何在除 Controller 之外的其他 Spring bean 上工作。尤其是在涉及异步调用以及断路器(信号量)类型时,不涉及 ThreadLocal。检查层次结构后,我了解到 StandardServletAsyncWebRequest 存在,但仍不确定最佳实践/示例。任何参考或文档,请与我们分享?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2018-05-10
    • 2023-03-30
    • 2021-04-18
    相关资源
    最近更新 更多