2013-09-05 13 views
5

Secondo doc ufficiale, LocaleContextHolder è:È LocaleContextHolder sicuro nel livello di servizio

semplice classe titolare che associa un'istanza LocaleContext al thread corrente.

Quindi è legato alla corrente thread, ma è questo parlando del filo Thread o un filo di richiesta corrente.

Chiedere scusa se si tratta di una domanda stupida, io non sono un LocaleContextHolder non è legato a una sessione HTTP o qualcosa in modo che sia sicuro da utilizzare in qualsiasi classe del livello di servizio.

risposta

10

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().

+0

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

+2

@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'. –

+0

Grandi risposte! – Dreamer

Problemi correlati