通常我们会看到很多地方可以直接注入一个HttpServletRequest来使用,但是在多线程的请求模型中,注入的HttpServletRequest是如何保证线程安全的呢?这个就利用到了ThreadLocal的技术。
首先当请求到来的时候,会执行以下代码
private void initContextHolders(HttpServletRequest request,
@Nullable LocaleContext localeContext, @Nullable RequestAttributes requestAttributes) {
if (localeContext != null) {
LocaleContextHolder.setLocaleContext(localeContext, this.threadContextInheritable);
}
if (requestAttributes != null) {
RequestContextHolder.setRequestAttributes(requestAttributes, this.threadContextInheritable);
}
if (logger.isTraceEnabled()) {
logger.trace("Bound request context to thread: " + request);
}
}
这样当我们获取request去调用方法的时候,就会先从这个RequestContextHolder中取出对应的request,然后再通过取出的对应的request来执行方法。
再来看看RequesContextHolder的实现方法
/**
* Holder class to expose the web request in the form of a thread-bound
*