2013-09-05 12 views
5

Według oficjalnego dokumentu, LocaleContextHolder jest:Czy LocaleContextHolder bezpieczny w warstwie usług

Proste klasy uchwyt, który kojarzy instancji LocaleContext z bieżącego wątku.

Więc to jest związane z bieżącym thread, ale jest to mówienie o gwincie Thread lub wątku bieżącego żądania.

Przepraszam, jeśli jest to głupie pytanie, nie jestem LocaleContextHolder nie jest związany z sesją HTTP lub czymś tak, że jest bezpieczny w użyciu w dowolnej klasie warstwy usług.

Odpowiedz

10

Jeśli spojrzeć na kodzie źródłowym LocaleContextHolder, można zauważyć, że ma zmienną ThreadLocal (ma dwa faktycznie)

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

można przeczytać o tym, co ThreadLocal jest jednak dla nas, uważają go struktura danych, która odwzorowuje identyfikator bieżącego wątku wykonawczego na obiekt swojego rodzaju ogólnego, LocaleContext tutaj.

Kontener serwletów ma pulę wątków, których używa do obsługi żądań klientów. Kiedy przychodzi żądanie, wyodrębnia jeden z tych wątków i wykonuje swoją metodę serwletu: service(). W przypadku Spring powoduje to wykonanie DispatcherServlet i wywołanie metody obsługi programu @Controller. Wszystko to dzieje się w tym oryginalnym pojemniku serwletu.

Po wywołaniu metody klasy @Service nadal znajdujesz się w tym samym wątku.

ThreadLocal w LocaleContextHolder jest set() w pewnym punkcie na początku przetwarzania żądania w FrameworkServlet (który jest typu nadrzędny DispatcherServlet) Metoda initContextHolders() wywoływana przez processRequest() w każdym doGet(), doPost() itp metod. Model Locale jest zbudowany z metody HttpServletRequest za pomocą metody getLocale().

+0

Bardzo dobre wyjaśnienia, zaoszczędź mi dużo czytania, żeby zdobyć taką esencję. Jeszcze jedno pytanie, ponieważ pojemnik zawiera pulę wątków, jeden "localeContextHolder" na wątek, więc czy to oznacza, że ​​każdy "wątek" obsługuje 'DispatchServlet', a każdy' dispatchServet' zawiera 'localeContexHolder'? Z góry dziękuję. – Dreamer

+2

@Dreamer Niezupełnie. Każdy wątek będzie miał 'LocaleContext' (jeśli jest' set() 'na' ThreadLocal'). "Wątek" utworzony przez kontener serwletu ma metodę "run()", która odwołuje się do twojego 'DispatcherServlet', którego używa do wywoływania metod z obiektami' HttpServletRequest' i 'HttpServletREsponse'. 'DispatcherServlet' _dispatches_ do twoich metod' @ Controller'. 'LocaleContexHolder' to' static' pole klasy 'LocaleContexHolder'. –

+0

Świetne odpowiedzi! – Dreamer

Powiązane problemy