根据官方文档,LocaleContextHolder是:
因此,它与当前thread
绑定(bind)在一起,但这是在谈论Thread
线程还是当前请求的线程。
抱歉,这是一个愚蠢的问题,我不是LocaleContextHolder,没有绑定(bind)到HTTP session 或其他任何东西,因此可以安全地在任何服务层类中使用。
最佳答案
如果查看LocaleContextHolder
的源代码,您会注意到它具有ThreadLocal
变量(实际上有两个)
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
您可以了解什么是
ThreadLocal
,但就我们而言,可以将其视为将当前执行线程的ID映射到其通用类型的对象LocaleContext
的数据结构。Servlet容器具有用于处理客户端请求的线程池。当请求进入时,它将提取这些线程之一并执行servlet的
service()
方法。使用Spring,这将导致DispatcherServlet
执行并调用@Controller
的处理程序方法。所有这些都发生在servlet容器选择的原始Thread
中。因此,当您调用
@Service
类的方法时,您仍处在同一线程中。ThreadLocal
中的LocaleContextHolder
在请求处理的早期是set()
,在FrameworkServlet
(这是DispatcherServlet
的父类型)中的initContextHolders()
方法processRequest()
在doGet()
,doPost()
等方法中的每种方法中都由Locale
调用。 HttpServletRequest
是通过getLocale()
及其ojit_code方法构建的。