9

公式ドキュメントによると、 LocaleContextHolder は次のとおりです。

LocaleContext インスタンスを現在のスレッドに関連付ける単純なホルダー クラス。

したがって、 current に関連付けられていますが、これはスレッドまたは現在のリクエストのスレッドthreadについて話しています。Thread

ばかげた質問である場合はお詫び申し上げます。LocaleContextHolder は HTTP セッションなどに関連付けられていないため、どのサービス層クラスでも安全に使用できます。

4

1 に答える 1

14

のソース コードを見ると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()

于 2013-09-05T19:08:58.657 に答える