2013-09-05 73 views
5

Theo doc chính thức, LocaleContextHolder là:là LocaleContextHolder an toàn trong lớp dịch vụ

Simple lớp giữ liên kết một ví dụ LocaleContext với thread hiện hành.

Vì vậy, nó được gắn với thread hiện tại, nhưng điều này nói về chủ đề Thread hoặc một chuỗi yêu cầu hiện tại.

Xin lỗi nếu nó là một câu hỏi ngớ ngẩn, tôi không phải là một LocaleContextHolder không được gắn với một phiên HTTP hoặc một cái gì đó để nó được an toàn để sử dụng trong bất kỳ lớp lớp dịch vụ nào.

Trả lời

10

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

+0

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

+2

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

+0

Câu trả lời hay! – Dreamer