2013-09-05 2 views
5

에서 LocaleContextHolder 안전한가요, LocaleContextHolder입니다 : 현재 스레드와 LocaleContext 인스턴스를 연관공식 문서에 따르면 서비스 계층

간단한 홀더 클래스입니다.

그래서 그것은 현재 thread에 묶여 있지만, 이것을 Thread 스레드 또는 현재 요청의 스레드에 대해 얘기입니다.

어리석은 질문 인 경우 사과하십시오. LocaleContextHolder가 HTTP 세션이나 무언가에 묶여 있지 않아서 서비스 레이어 클래스에서 사용하기에 안전하지 않습니다.

답변

10

LocaleContextHolder의 소스 코드를 보면, 당신은 그것이 ThreadLocal 변수가 알 수

private static final ThreadLocal<LocaleContext> localeContextHolder = 
     new NamedThreadLocal<LocaleContext>("Locale context"); 

당신은 그것을 고려하는 ThreadLocal이 무엇인지에 대해 그러나 우리를 위해서 읽을 수 있습니다 (실제로이있다) 현재 실행중인 스레드의 ID를 일반 유형 인 LocaleContext의 객체에 매핑하는 데이터 구조체입니다.

서블릿 컨테이너에는 클라이언트 요청을 처리하는 데 사용하는 스레드 풀이 있습니다. 요청이 들어 오면이 스레드 중 하나를 추출하여 서블릿의 service() 메소드를 실행합니다. Spring을 사용하면 DispatcherServlet이 실행되고 @Controller의 핸들러 메소드가 호출됩니다. 이 모든 것은 서블릿 컨테이너가 원래 선택한 Thread에서 발생합니다.

따라서 @Service 클래스의 메서드가 호출되면 여전히 같은 스레드에 있습니다. LocaleContextHolderThreadLocal

등 방법 doGet(), doPost()processRequest() 호출 방법 initContextHolders() ( DispatcherServlet의 부모 타입 임) FrameworkServlet에서 요구 처리 초기에 어느 시점 set()이다. LocalegetLocale() 메서드가있는 HttpServletRequest에서 만들어집니다.

+0

아주 좋은 설명은, 저에게 그런 본질을 얻기 위해 많은 독서를 구하십시오. 또 하나의 질문은 컨테이너가 스레드 풀을 보유하고 스레드 당 하나의'localeContextHolder'도 마찬가지라는 것입니다. 각각의'thread'가'DispatchServlet'을 지원하고 각각의'dispatchServet'이'localeContexHolder'를 보유한다는 것입니까? 미리 감사드립니다. – Dreamer

+2

@Dreamer 정확하지 않습니다. 각 스레드는'LocaleContext'를 가질 것입니다 ('ThreadLocal'에'set()'이있는 경우). 서블릿 컨테이너에 의해 생성 된'Thread'는'HttpServletRequest'와'HttpServletREsponse' 객체로 메소드를 호출하기 위해 사용하는'DispatcherServlet'에 대한 참조를 가진'run()'메소드를 가지고 있습니다. 'DispatcherServlet' _dispatches_를'@ Controller' 메소드에 전달합니다. 'localeContextHolder'는'LocaleContexHolder' 클래스의'static' 필드입니다. –

+0

위대한 답변! – Dreamer

관련 문제