@RestController
public class MyController{
@Autowire
HttpServletRequest request;
@RequestMapping("/test")
public String test(){
String param = request.getParameter("param");
return param;
}
}
上述代码是SpringBoot开发中的常见代码,request对象在Controller中应用比较多,为了使用方便,经常使用Autowire注入成员变量request。由于Controller默认是单例的,那么这样做是否有线程安全问题呢?
结论
spring框架在初始IOC的时候,创建了一个Request对象的代理类,从而完成了初始注入,代理类负责从ThreadLocal中获取真正的Request对象并调用相应的方法。每次对成员变量request(实际上是个代码类)的任何方法的调用,最终转化成了该次请求真正的request对象的方法,因此不存在线程安全问题。