根据官方文档,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方法构建的。

10-08 08:54