あなたはLocaleContextHolder
のソースコードを見れば、あなたはそれがThreadLocal
変数を持って気づくでしょう
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
は、あなたはそれを考慮、ThreadLocal
が何であるかについて、私たちのために読むことができます(それは実際には二つあり)現在実行中のスレッドのIDをジェネリック型オブジェクトLocaleContext
のオブジェクトにマップするデータ構造体。
サーブレットコンテナには、クライアント要求を処理するために使用するスレッドのプールがあります。リクエストが入ると、これらのスレッドの1つが抽出され、サーブレットのservice()
メソッドが実行されます。 Springでは、DispatcherServlet
が実行され、@Controller
のハンドラメソッドが呼び出されます。これはすべて、オリジナルのThread
サーブレットコンテナが選択された場合に発生します。
したがって、あなたの@Service
クラスのメソッドが呼び出されると、あなたはまだ同じスレッドに属しています。 LocaleContextHolder
にThreadLocal
等の方法doGet()
、doPost()
のそれぞれにprocessRequest()
によって呼び出されるメソッドinitContextHolders()
、(DispatcherServlet
の親型である)FrameworkServlet
で、要求処理の早い段階でいくつかの点でset()
あります。 Locale
は、getLocale()
メソッドのHttpServletRequest
から構築されています。
非常に良い説明は、私にそのような本質を得るために多くの読書を保存します。もう1つの疑問は、コンテナがスレッドのプールを保持するので、スレッドごとに1つの 'localeContextHolder'があります。つまり、'スレッド 'が' DispatchServlet'をサポートし、 'dispatchServet'が' localeContexHolder'を保持していますか?前もって感謝します。 – Dreamer
@Dreamer正確ではありません。各スレッドは 'LocaleContext'を持ちます(' ThreadLocal'に 'set()'がある場合)。サーブレットコンテナによって生成される 'Thread'は' HttpServletRequest'と 'HttpServletREsponse'オブジェクトでメソッドを呼び出すために使用する' DispatcherServlet'への参照を持つrun()メソッドを持っています。 'DispatcherServlet' _dispatches_をあなたの' @Controller'メソッドに渡します。 'localeContexHolder'は' LocaleContexHolder'クラスの 'static'フィールドです。 –
すばらしい答え! – Dreamer