根据官方文档,LocaleContextHolder是:
将LocaleContext示例与当前线程关联的简单保持器类。
因此它被绑定到当前thread
,但这是在谈论Thread
线程还是当前请求的线程。
如果这是一个愚蠢的问题,请道歉,我不确定LocaleContextHolder是否绑定到HTTP会话或其他东西,以便在任何服务层类中使用它都是安全的。
根据官方文档,LocaleContextHolder是:
将LocaleContext示例与当前线程关联的简单保持器类。
因此它被绑定到当前thread
,但这是在谈论Thread
线程还是当前请求的线程。
如果这是一个愚蠢的问题,请道歉,我不确定LocaleContextHolder是否绑定到HTTP会话或其他东西,以便在任何服务层类中使用它都是安全的。
1条答案
按热度按时间jckbn6z71#
如果您查看
LocaleContextHolder
的源代码,您会注意到它有一个ThreadLocal
变量(实际上有两个)您可以了解
ThreadLocal
是什么,但为了方便起见,请将其视为一种数据结构,它将当前执行线程的IDMap到其泛型类型的对象,这里是LocaleContext
。Servlet容器有一个线程池,用来处理客户端请求。当请求到来时,它会提取其中一个线程,并执行servlet的
service()
方法。在Spring中,这会导致DispatcherServlet
执行,并调用@Controller
的handler方法。这一切都发生在servlet容器选择的原始Thread
中。所以当你的
@Service
类的方法被调用时,你仍然在同一个线程中。LocaleContextHolder
中的ThreadLocal
是FrameworkServlet
中请求处理早期某个点的set()
(它是DispatcherServlet
的父类型)方法initContextHolders()
,该方法由processRequest()
在doGet()
、doPost()
Locale
是通过HttpServletRequest
及其getLocale()
方法构建的。