[英]Is LocaleContextHolder safe in service layer
根據官方文檔,LocaleContextHolder是:
簡單的holder類,它將LocaleContext實例與當前線程相關聯。
所以它與當前thread
,但這是關於Thread
線程還是當前請求的線程。
如果它是一個愚蠢的問題,請道歉,我不是一個LocaleContextHolder沒有綁定到HTTP會話或其他東西,以便在任何服務層類中使用是安全的。
如果查看LocaleContextHolder
的源代碼,你會發現它有一個ThreadLocal
變量(實際上有兩個)
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
您可以閱讀ThreadLocal
內容但是為了我們的目的,請將其視為將當前正在執行的線程的ID映射到其泛型類型的對象LocaleContext
的數據結構。
Servlet容器有一個用於處理客戶端請求的線程池。 當請求進入時,它將提取其中一個線程並執行您的servlet的service()
方法。 使用Spring,這會導致DispatcherServlet
執行並調用@Controller
的處理程序方法。 這一切都發生在servlet容器選擇的原始Thread
中。
所以當你的@Service
類'方法被調用時,你仍然在同一個線程中。
所述ThreadLocal
在LocaleContextHolder
是set()
在某個點早在請求處理,在FrameworkServlet
(其為母體的類型DispatcherServlet
)方法initContextHolders()
通過被稱為processRequest()
中的每個的doGet()
doPost()
等等。方法。 Locale
是使用其getLocale()
方法從HttpServletRequest
構建的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.