根据官方文档, LocaleContextHolder 是:
将 LocaleContext 实例与当前线程相关联的简单持有者类。
所以它与 current 相关联thread
,但这是在谈论Thread
线程还是当前请求的线程。
如果这是一个愚蠢的问题,请道歉,我不是 LocaleContextHolder 不绑定到 HTTP 会话或其他东西,以便在任何服务层类中使用它是安全的。
根据官方文档, LocaleContextHolder 是:
将 LocaleContext 实例与当前线程相关联的简单持有者类。
所以它与 current 相关联thread
,但这是在谈论Thread
线程还是当前请求的线程。
如果这是一个愚蠢的问题,请道歉,我不是 LocaleContextHolder 不绑定到 HTTP 会话或其他东西,以便在任何服务层类中使用它是安全的。
如果您查看 的源代码LocaleContextHolder
,您会注意到它有一个ThreadLocal
变量(实际上有两个)
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
您可以阅读 aThreadLocal
是什么,但为了我们的缘故,将其视为一种数据结构,将当前执行线程的 ID 映射到其泛型类型的对象,LocaleContext
here。
Servlet 容器有一个线程池,用于处理客户端请求。当一个请求进来时,它会提取其中一个线程并执行你的 servlet 的service()
方法。使用 Spring,这会导致DispatcherServlet
执行并@Controller
调用您的处理程序方法。这一切都发生在Thread
servlet 容器选择的原始文件中。
所以当你的@Service
类的方法被调用时,你仍然在同一个线程中。
ThreadLocal
inLocaleContextHolder
在set()
请求处理的早期某个时间点, in (FrameworkServlet
它是 的父类型DispatcherServlet
)方法在每个,等方法中initContextHolders()
被调用。是从with方法构建的。processRequest()
doGet()
doPost()
Locale
HttpServletRequest
getLocale()