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()
.
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
@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'. –
Świetne odpowiedzi! – Dreamer