1、首先大家先看一段代码
@RestController
@RequestMapping("/myTest")
public class MyTestController {
@Autowired
private HttpServletRequest request;
@GetMapping("/add" )
@ResponseBody
public String add() {
String name=request.getParameter("name");
return name;
}
}
2、相信大家都知道spring中类的作用域默认为单例,既然是单例那么上述代码一定不是线程安全的,但是经过测试却发现 上述代码是线程安全(测试过程这里不写了),我们写法没有任何问题。这是为什么呢?接下来我们一步一步通过源码查找这个问题。
3、通过上图我们会发现request被注入的对象是一个动态代理生成的类,并且objectFactory是WebApplicationContextUtils中的内部类**RequestObjectFactory**。如下图
![](https://i-blog.csdnimg.cn/blog_migrate/a22f04543cece76243e5f3d352a4b313.jpeg)
4、那么它是如何被调用的呢?
4.1、spring在初始化bean对象的时候会调用WebApplicationContextUtils----->registerWebApplicationScopes();该方法部分代码如下:
beanFactory.registerResolvableDependency(ServletRequest.class, new WebApplicationContextUtils.RequestObjectFactory());
beanFactory.registerResolvableDependency(ServletResponse.class, new WebApplicationContextUtils.ResponseObjectFactory());
beanFactory.registerResolvableDependency(HttpSession.class, new WebApplicationContextUtils.SessionObjectFactory());
beanFactory.registerResolvableDependency(WebRequest.class, new WebApplicationContextUtils.WebRequestObjectFactory());
这段代码是将对应的类以及工厂类缓存好,方便后续使用。最终放在类DefaultListableBeanFactory的resolvableDependencies中。代码如下
@Override
public void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue) {
Assert.