LocaleContextHolder在服务层是否安全

Dre*_*mer 8 java spring spring-mvc

根据官方文档,LocaleContextHolder是:

简单的holder类,它将LocaleContext实例与当前线程相关联.

所以它与当前有关thread,但这是关于Thread线程还是当前请求的线程.

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

Sot*_*lis 13

如果你查看源代码LocaleContextHolder,你会发现它有一个ThreadLocal变量(实际上有两个)

private static final ThreadLocal<LocaleContext> localeContextHolder =
        new NamedThreadLocal<LocaleContext>("Locale context");
Run Code Online (Sandbox Code Playgroud)

您可以阅读有关内容ThreadLocal但是为了我们的目的,请将其视为将当前正在执行的线程的ID映射到其泛型类型的对象的数据结构LocaleContext.

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

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

ThreadLocalLocaleContextHolderset()在某一时刻早在请求处理,在FrameworkServlet(这是父类型DispatcherServlet)方法initContextHolders()由被称为processRequest()在每个doGet(),doPost()等方法.它LocaleHttpServletRequest用它的getLocale()方法构建的.

  • @Dreamer不完全是.每个线程都有一个`LocaleContext`(如果它是`ThreadLocal`上的`set()`).由servlet容器生成的`Thread`有一个`run()`方法,它引用了你的`DispatcherServlet`,它用它来调用带有`HttpServletRequest`和`HttpServletREsponse`对象的方法.`DispatcherServlet` _dispatches_到你的`@Controller`方法.`localeContexHolder`是`LocaleContexHolder`类的`static`字段. (2认同)