9

根据官方文档, LocaleContextHolder 是:

将 LocaleContext 实例与当前线程相关联的简单持有者类。

所以它与 current 相关联thread,但这是在谈论Thread线程还是当前请求的线程。

如果这是一个愚蠢的问题,请道歉,我不是 LocaleContextHolder 不绑定到 HTTP 会话或其他东西,以便在任何服务层类中使用它是安全的。

4

1 回答 1

14

如果您查看 的源代码LocaleContextHolder,您会注意到它有一个ThreadLocal变量(实际上有两个)

private static final ThreadLocal<LocaleContext> localeContextHolder =
        new NamedThreadLocal<LocaleContext>("Locale context");

您可以阅读 aThreadLocal是什么,但为了我们的缘故,将其视为一种数据结构,将当前执行线程的 ID 映射到其泛型类型的对象,LocaleContexthere。

Servlet 容器有一个线程池,用于处理客户端请求。当一个请求进来时,它会提取其中一个线程并执行你的 servlet 的service()方法。使用 Spring,这会导致DispatcherServlet执行并@Controller调用您的处理程序方法。这一切都发生在Threadservlet 容器选择的原始文件中。

所以当你的@Service类的方法被调用时,你仍然在同一个线程中。

ThreadLocalinLocaleContextHolderset()请求处理的早期某个时间点, in (FrameworkServlet它是 的父类型DispatcherServlet)方法在每个,等方法中initContextHolders()被调用。是从with方法构建的。processRequest()doGet()doPost()LocaleHttpServletRequestgetLocale()

于 2013-09-05T19:08:58.657 回答