Se si guarda il codice sorgente per LocaleContextHolder
, si noterà che ha una variabile ThreadLocal
(ha due in realtà)
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
Si può leggere su ciò che un ThreadLocal
è, ma per il nostro bene, prendere in considerazione una struttura dati che associa l'ID del thread in esecuzione corrente a un oggetto del suo tipo generico, LocaleContext
qui.
Un contenitore di servlet dispone di un pool di thread che utilizza per gestire le richieste dei client. Quando arriva una richiesta, estrae uno di questi thread ed esegue il metodo service()
del servlet. Con Spring, ciò comporta l'esecuzione di DispatcherServlet
e il metodo del gestore @Controller
chiamato. Tutto ciò avviene in quel Thread
originale scelto dal contenitore servlet.
Così, quando il metodo di @Service
classe viene chiamato, sei ancora in quello stesso thread.
Il ThreadLocal
in LocaleContextHolder
è set()
ad un certo punto presto nella elaborazione delle richieste, in FrameworkServlet
(che è il tipo di genitore DispatcherServlet
) Metodo initContextHolders()
chiamato da processRequest()
in ciascuna delle doGet()
, doPost()
, ecc metodi. Il Locale
è stato creato dal HttpServletRequest
con il suo metodo getLocale()
.
fonte
2013-09-05 19:08:58
Molto buone spiegazioni, mi risparmiare un sacco di leggere per ottenere tale essenza. Un'altra domanda è, come il contenitore contiene un pool di filo, uno 'localeContextHolder' per thread in modo significa che ogni' thread' sostenere una 'DispatchServlet' e ogni dispatchServet' detiene una' 'localeContexHolder'? Grazie in anticipo. – Dreamer
@Dreamer Non esattamente. Ogni thread avrà un 'LocaleContext' (se è' set() 'su' ThreadLocal'). Il 'Thread' generato dal servlet container ha un metodo' run() che ha un riferimento al vostro 'DispatcherServlet' che utilizza per chiamare i metodi con i' 'HttpServletRequest' e HttpServletREsponse' oggetti. Il 'DispatcherServlet' _dispatches_ ai tuoi metodi' @ Controller'. 'LocaleContexHolder' è un campo' static' della classe 'LocaleContexHolder'. –
Grandi risposte! – Dreamer