Spring中请求作用域Bean注入单例@RestController的原理
单例@RestController注入请求作用域Bean的实现原理
- Spring靠动态代理解决单例Bean注入请求作用域Bean的矛盾:当你在单例
@RestController里用@Autowired注入请求作用域的RequestContext时,Spring不会直接注入真实的RequestContext实例,而是注入一个代理对象。 - 当Controller处理HTTP请求时,这个代理对象会自动关联当前请求的上下文:它会从Spring维护的请求作用域缓存中,获取或创建属于当前请求的
RequestContext实例。 - 并发场景下(比如5个请求同时处理),每个请求对应的线程都会通过代理拿到自己专属的
RequestContext:Spring内部用ThreadLocal把请求作用域Bean和当前线程绑定,所以每个线程访问代理时,都会拿到和自身线程绑定的Bean实例,互不干扰。 - 代理对象本身是单例的,和Controller实例共存;而真实的
RequestContext实例会随着请求的创建而生成,请求结束后被销毁,完全符合请求作用域的定义。
内容的提问来源于stack exchange,提问作者mipo256
相关产品推荐
相关产品推荐

