Nếu bạn nhìn vào các mã nguồn cho LocaleContextHolder
, bạn sẽ thấy nó có một biến ThreadLocal
(nó có hai thực sự)
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
Bạn có thể đọc về những gì một ThreadLocal
là nhưng vì lợi ích của chúng tôi, hãy xem xét nó một cấu trúc dữ liệu ánh xạ ID của chuỗi thực hiện hiện tại tới một đối tượng thuộc loại chung của nó, LocaleContext
tại đây.
Một thùng chứa Servlet có một nhóm các chủ đề mà nó sử dụng để xử lý các yêu cầu của khách hàng. Khi có yêu cầu, nó sẽ trích xuất một trong các luồng này và thực hiện phương thức service()
của servlet của bạn. Với Spring, điều này dẫn đến việc thực hiện DispatcherServlet
và phương thức xử lý của phương thức @Controller
của bạn đang được gọi. Tất cả điều này xảy ra trong đó ban đầu Thread
container servlet đã chọn.
Vì vậy, khi phương thức của lớp học @Service
được gọi, bạn vẫn ở trong cùng một chuỗi đó.
Các ThreadLocal
trong LocaleContextHolder
là set()
tại một số điểm sớm trong xử lý yêu cầu, trong FrameworkServlet
(đó là loại mẹ của DispatcherServlet
) phương pháp initContextHolders()
gọi bằng processRequest()
trong mỗi doGet()
, doPost()
, vv phương pháp. Các Locale
được xây dựng từ HttpServletRequest
với phương pháp getLocale()
của nó.
Nguồn
2013-09-05 19:08:58
Giải thích rất tốt, tiết kiệm cho tôi rất nhiều đọc để có được bản chất như vậy. Một câu hỏi nữa là, vì container chứa một nhóm luồng, một 'localeContextHolder' trên mỗi luồng nên điều đó có nghĩa là mỗi' thread' hỗ trợ một 'DispatchServlet' và mỗi' dispatchServet' giữ một 'localeContexHolder'? Cảm ơn trước. – Dreamer
@Dreamer Không chính xác. Mỗi luồng sẽ có một 'LocaleContext' (nếu nó là' set() 'trên' ThreadLocal'). 'Thread' được sinh ra bởi thùng chứa servlet có một phương thức' run() 'có tham chiếu đến' DispatcherServlet' của bạn mà nó sử dụng để gọi các phương thức với các đối tượng 'HttpServletRequest' và' HttpServletREsponse'. 'DispatcherServlet' _dispatches_ vào phương thức' @ Controller' của bạn. 'LocaleContexHolder' là trường' static' của lớp 'LocaleContexHolder'. –
Câu trả lời hay! – Dreamer