는 LocaleContextHolder
의 소스 코드를 보면, 당신은 그것이 ThreadLocal
변수가 알 수
private static final ThreadLocal<LocaleContext> localeContextHolder =
new NamedThreadLocal<LocaleContext>("Locale context");
당신은 그것을 고려하는 ThreadLocal
이 무엇인지에 대해 그러나 우리를 위해서 읽을 수 있습니다 (실제로이있다) 현재 실행중인 스레드의 ID를 일반 유형 인 LocaleContext
의 객체에 매핑하는 데이터 구조체입니다.
서블릿 컨테이너에는 클라이언트 요청을 처리하는 데 사용하는 스레드 풀이 있습니다. 요청이 들어 오면이 스레드 중 하나를 추출하여 서블릿의 service()
메소드를 실행합니다. Spring을 사용하면 DispatcherServlet
이 실행되고 @Controller
의 핸들러 메소드가 호출됩니다. 이 모든 것은 서블릿 컨테이너가 원래 선택한 Thread
에서 발생합니다.
따라서 @Service
클래스의 메서드가 호출되면 여전히 같은 스레드에 있습니다. LocaleContextHolder
의 ThreadLocal
등 방법
doGet()
,
doPost()
각
processRequest()
호출 방법
initContextHolders()
(
DispatcherServlet
의 부모 타입 임)
FrameworkServlet
에서 요구 처리 초기에 어느 시점
set()
이다.
Locale
은
getLocale()
메서드가있는
HttpServletRequest
에서 만들어집니다.
아주 좋은 설명은, 저에게 그런 본질을 얻기 위해 많은 독서를 구하십시오. 또 하나의 질문은 컨테이너가 스레드 풀을 보유하고 스레드 당 하나의'localeContextHolder'도 마찬가지라는 것입니다. 각각의'thread'가'DispatchServlet'을 지원하고 각각의'dispatchServet'이'localeContexHolder'를 보유한다는 것입니까? 미리 감사드립니다. – Dreamer
@Dreamer 정확하지 않습니다. 각 스레드는'LocaleContext'를 가질 것입니다 ('ThreadLocal'에'set()'이있는 경우). 서블릿 컨테이너에 의해 생성 된'Thread'는'HttpServletRequest'와'HttpServletREsponse' 객체로 메소드를 호출하기 위해 사용하는'DispatcherServlet'에 대한 참조를 가진'run()'메소드를 가지고 있습니다. 'DispatcherServlet' _dispatches_를'@ Controller' 메소드에 전달합니다. 'localeContextHolder'는'LocaleContexHolder' 클래스의'static' 필드입니다. –
위대한 답변! – Dreamer