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