2013-09-05 7 views
5

にLocaleContextHolder安全です、LocaleContextHolderは次のとおりです。現在のスレッドにLocaleContextインスタンスを関連付けは公式のドキュメントによると、サービス層

シンプルなホルダークラス。

だから、それが現在のthreadに結び付けられているが、これはThreadスレッドまたは現在のリクエストのスレッドについて話しています。

私はLocaleContextHolderがHTTPセッションや何かに結び付けられていないので、どんなサービスレイヤークラスでも安全に使用できるようになっています。

答えて

10

あなたはLocaleContextHolderのソースコードを見れば、あなたはそれがThreadLocal変数を持って気づくでしょう

private static final ThreadLocal<LocaleContext> localeContextHolder = 
     new NamedThreadLocal<LocaleContext>("Locale context"); 

は、あなたはそれを考慮、ThreadLocalが何であるかについて、私たちのために読むことができます(それは実際には二つあり)現在実行中のスレッドのIDをジェネリック型オブジェクトLocaleContextのオブジェクトにマップするデータ構造体。

サーブレットコンテナには、クライアント要求を処理するために使用するスレッドのプールがあります。リクエストが入ると、これらのスレッドの1つが抽出され、サーブレットのservice()メソッドが実行されます。 Springでは、DispatcherServletが実行され、@Controllerのハンドラメソッドが呼び出されます。これはすべて、オリジナルのThreadサーブレットコンテナが選択された場合に発生します。

したがって、あなたの@Serviceクラスのメソッドが呼び出されると、あなたはまだ同じスレッドに属しています。 LocaleContextHolderThreadLocal

等の方法doGet()doPost()のそれぞれにprocessRequest()によって呼び出されるメソッドinitContextHolders()、(DispatcherServletの親型である)FrameworkServletで、要求処理の早い段階でいくつかの点でset()あります。 Localeは、getLocale()メソッドのHttpServletRequestから構築されています。

+0

非常に良い説明は、私にそのような本質を得るために多くの読書を保存します。もう1つの疑問は、コンテナがスレッドのプールを保持するので、スレッドごとに1つの 'localeContextHolder'があります。つまり、'スレッド 'が' DispatchServlet'をサポートし、 'dispatchServet'が' localeContexHolder'を保持していますか?前もって感謝します。 – Dreamer

+2

@Dreamer正確ではありません。各スレッドは 'LocaleContext'を持ちます(' ThreadLocal'に 'set()'がある場合)。サーブレットコンテナによって生成される 'Thread'は' HttpServletRequest'と 'HttpServletREsponse'オブジェクトでメソッドを呼び出すために使用する' DispatcherServlet'への参照を持つrun()メソッドを持っています。 'DispatcherServlet' _dispatches_をあなたの' @Controller'メソッドに渡します。 'localeContexHolder'は' LocaleContexHolder'クラスの 'static'フィールドです。 –

+0

すばらしい答え! – Dreamer

関連する問題