假设我们已经定义了一个只有@Controller
注释的控制器类。
在课堂内,我们定义了private @Autowired HttpServletRequest request;
变量。
Spring Controller是Singleton。当我们在网络应用中将HttpServletRequest
定义为@Autowired
时,它会成为一个问题吗?
我从一个网站上读到,即使它是@Autowired
,它只是为线程变量注入一个代理。
这是真的吗?在多线程环境中,我们可以使用@Autowired
或将HttpServletRequest
作为参数传递给控制器类中的每个方法,这是正确的方法吗?
有些网站表示这是一个问题,建议将其作为参数传递,而很少有人说这将是一个问题。
我不明白哪一个是对的。
答案 0 :(得分:5)
两者都可以。 @Autowired HttpServletRequest
并作为参数传递是一回事。
在将HttpServletRequest传递给响应@RequestMapping
函数的创新方法之前,Spring将HttpServletRequest
存储到ThreadLocal
类型变量中。
ThreadLocal
变量是一个线程安全的映射,它将HttpServletRequest
保留在当前线程上下文中。 @Autowired HttpServletRequest
代理bean从ThreadLocal
变量中获取正确的请求。