@Autowired HttpServletRequest vs传递参数 - 最佳实践

时间:2018-02-02 02:18:26

标签: spring spring-mvc

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

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

Spring Controller是Singleton。当我们在网络应用中将HttpServletRequest定义为@Autowired时,它会成为一个问题吗?

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

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

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

我不明白哪一个是对的。

1 个答案:

答案 0 :(得分:5)

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

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

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