のソース コードを見るとLocaleContextHolder、変数があることがわかりThreadLocalます (実際には 2 つある) 。
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
a とは何かについて読むことができますが、ここThreadLocalでは、現在実行中のスレッドの ID をそのジェネリック型のオブジェクトにマップするデータ構造と考えてLocaleContextください。
サーブレット コンテナには、クライアント リクエストの処理に使用するスレッドのプールがあります。リクエストが来ると、これらのスレッドの 1 つが抽出され、サーブレットのservice()メソッドが実行されます。Spring では、これによりDispatcherServlet実行が行われ、@Controllerのハンドラ メソッドが呼び出されます。これはすべてThread、サーブレット コンテナが選択したオリジナルで発生します。
したがって、@Serviceクラスのメソッドが呼び出されたとき、あなたはまだ同じスレッドにいます。
ThreadLocalinLocaleContextHolderは、リクエスト処理のset()早い段階で、 in FrameworkServlet( の親タイプDispatcherServlet) メソッドinitContextHolders()によって呼び出されます。processRequest()各 in doGet()、doPost()などのメソッド。は、そのメソッドを使用してLocaleから構築されます。HttpServletRequestgetLocale()