SpringMVC 의 소스 코드 분석

6376 단어 SpringMVC
자바 를 배 우 는 사람들 은 spring,springMVC,my batis 등 프레임 워 크 를 알 고 있 습 니 다.structs 2 와 같은 프레임 워 크 는 servlet 이외 에 이 루어 진 것 이 고 springMVC 는 servlet 용기 에 의 해 이 루어 진 것 입 니 다.
본 고 는 SpringMVC 의 핵심 배포 기 Dispatcher Servlet 의 초기 화 과정 과 요청 을 처리 하 는 과정 을 분석 하여 독자 에 게 이 입구 Servlet 의 역할 을 알 리 고자 한다.
Dispatcher Servlet 를 분석 하기 전에 Dispatcher Servlet 의 계승 관 계 를 살 펴 보 겠 습 니 다.

HttpSerlvetBean 은 HttpServlet 에서 물 려 받 았 다.
HttpServletBean 은 init 방법 을 덮어 쓰 고 초기 화 과정 을 처리 했다.다음은 초기 화 된 코드 입 니 다.

우선,ServletConfigPropertyValues 는 HttpServletBean 의 정적 클래스 입 니 다.구조 과정 은 ServletConfig 대상 을 사용 하여 웹.xml 파일 에 설 정 된 파 라 메 터 를 찾 아 ServletConfigPropertyValue 로 설정 합 니 다.BeanWrapper 를 사용 하여 Dispatcher Servlet 을 구성 하고 ServletContextResourceLoader 의 자원 가 져 오기 다음 에 자원 편집 기 를 등록 하여 BeanWrapper 대상 을 초기 화 합 니 다.Dispatcher Servlet 속성 을 설정 합 니 다.기본적으로 ServletBean 을 초기 화 합 니 다.하위 클래스 는 이 방법 을 덮어 쓰 면 모든 일 을 할 수 있 습 니 다.
다음은 웹.xml 파일 설정 입 니 다.

이 설정 은 contextConfigLocation 로 초기 화 되 었 습 니 다.나중에 구 조 된 것 은 BeanWrapper 대상 입 니 다.contextConfigLocation 는 Framework Servlet 에서 정의 되 었 으 나 HttpServletBean 에서 정의 되 지 않 았 습 니 다.Spring 의 주입 특성 을 이용 하여 setContextConfigLocation 방법 만 호출 하면 contextConfigLocation 를 해당 하 는 인 스 턴 스 에 설정 할 수 있 습 니 다.그리고 Dispatcher Servlet 에서 contextConfigLocation(Frameworkservlet 에서 정의)의 속성 을 설정 하여 웹.xml 에서 contextConfigLocation 인 자 를 읽 습 니 다.이 자원 파일 은 SpringMVC 용 기 를 구성 하 는 컨 텍스트 를 사용 합 니 다.
다음은 Framework Servlet 같은 종 류 를 살 펴 보 겠 습 니 다.Framework Servlet 은 Http ServletBean 에서 계승 합 니 다.
다음은 initServletBean 의 코드 입 니 다.

우선 첫 번 째 단 계 는 웹 애플 리 케 이 션 Context 를 초기 화 하 는 것 입 니 다.애플 리 케 이 션 Context 는 Spring 용기 의 컨 텍스트 입 니 다.Servlet 는 Spring 용기 와 연 결 된 역할 을 한 다음 에 FrameWorkServlet 을 초기 화 합 니 다.사실은 비어 있 고 무엇이든 할 수 있 습 니 다.하위 클래스 는 이 방법 을 다시 쓸 수 있 습 니 다.그러나 Dispatcher Servlet 은 이 방법 을 다시 쓸 수 있 습 니 다.
다음은 initWebapplicationContext 를 초기 화 하 는 구체 적 인 실현 논리 입 니 다. 
    
우선,루트 경 로 를 얻 으 면 Distpacherservlet 에 웹 애플 리 케 이 션 을 매개 변수 로 하 는 구조 함수 가 있 습 니 다.웹 애플 리 케 이 션 이라는 대상 을 주입 하면 위의 그림 코드 를 실행 합 니 다.

Framework Servlet 에는 String 형식의 contextAttribute 변수 이름 이 있 습 니 다.이 를 key 로 하여 ServletContextWebApplication Context 에 서 는 일반적으로 설정 되 지 않 습 니 다.contextAttribute 속성,즉 wac 시작 은 null 입 니 다.다음은 웹 애플 리 케 이 션 Context 를 만 들 고 루트 컨 텍스트 를 부모 컨 텍스트 로 설정 한 다음 에 ServletConfig,ServletContext 를 설정 하여 이 컨 텍스트 를 기다 리 는 것 입 니 다.이 클래스 에 함수 onReFresh 는 모델 링 방법 입 니 다.웹 애플 리 케 이 션 이 성공 적 으로 생 성 되면 호출 됩 니 다.Framework Servlet 의 실현 클래스 는 이 방법 을 다시 씁 니 다.생 성 된 용기 컨 텍스트 를 ServletContext 에 설정 합 니 다.이 컨 텍스트 는 웹.xml 에 설 치 된 ContextLoaderListener 모니터 에서 contextConfigLocation 경로 에 따라 생 성 된 컨 텍스트 입 니 다.

예 를 들 어 이 프로필 에서 classpath:context-*.xml 의 xml 파일 에 따라 생 성 된 루트 컨 텍스트 입 니 다.
이 어 Dispatcher Servlet 에서 Framework Servlet 의 onReFresh 방법 을 다시 썼 습 니 다.

initStrategies 방법 에서 각종 전략 인터페이스의 실현 류 를 초기 화하 고 그 다음 에 각 전략 인터페이스의 실현 에 대한 상세 한 소 개 를 분석 할 수 있 습 니 다.
세 가지 역할 을 요약 한다.
HttpServletBean 은 주로 웹.xml 에 설 정 된 인 자 를 Servlet 에 설정 하 는 초기 화 작업 을 합 니 다.예 를 들 어 servlet 태그 의 하위 태그 init-param 태그 에 설 정 된 인자 입 니 다.
Framework Servlet 은 Servlet 를 Spring 용기 컨 텍스트 와 연결 합 니 다.사실은 Frameworkservlet 의 속성 웹 응용 프로그램 Context 를 초기 화 하 는 것 입 니 다.이 속성 은 SpringMVC 컨 텍스트 를 대표 합 니 다.부모 컨 텍스트,웹.xml 에 설 치 된 ContextLoaderListener 모니터 가 초기 화 된 용기 컨 텍스트 가 있 습 니 다.
Dispatcher Servlet 은 주로 각 정책 인터페이스의 실현 을 초기 화 합 니 다.예 를 들 어 처리 요청,처리 시도.적절하게 처리 하 다.
DispatcherServlet 요청 처리 과정:
먼저 HttpServlet 이 제공 하 는 방법 을 보고 요청 을 처리 하 는 데 사 용 됩 니 다.service 는 모드 모드 모드 를 사 용 했 습 니 다.HttpServlet 의 get 요청 에 대해 doGet 방법,post 요청,doPost 방법 을 호출 했 습 니 다.

프로 세 스 Request 함수 처리 하기

우선,현재 스 레 드 에 연 결 된 LocaleContext 와 ServletRequestAttributes 대상 을 가 져 옵 니 다.initContextHoers 함 수 는 새로운 구조의 LocaleContex 와 requestAttributes 를 연결 시 키 는 것 입 니 다.이 관 계 는 ThreadLocal 을 사용 하여 이 루어 집 니 다.doService 방법 은 추상 적 인 방법 이 고 구체 적 으로 Dispatcher Servlet 에 의 해 이 루어 집 니 다.

마지막 으로 resetContextHolders 함 수 를 호출 하여 LocaleContext 와 RequestAttribute 대상 을 초기 화하 고 LocaleContext 와 RequestAttribute 대상 의 연결 을 해제 합 니 다.실행 에 성공 하면 ServletRequestHandlerEvent 이 벤트 를 발표 하고 등록 감청 기 를 통 해 이 이벤트 의 발 표를 감청 할 수 있 습 니 다.등 록 된 모니터 종 류 는 ApplicationListener 인터페이스 형식 입 니 다.
다음은 Dispatcher Servlet 의 doService 방법 입 니 다.

이 요청 이 include 요청 이 라면 스냅 샷 버 전의 request 필드 에 있 는 데 이 터 를 보존 합 니 다.doDispatch 방법 이후 이 스냅 샷 버 전의 데 이 터 는 새로운 Requet 필드 의 데 이 터 를 덮어 씁 니 다.  
그리고 request 에 속성 을 설정 하고 마지막 으로 doDispatcher 에서 배포 요청 처 리 를 합 니 다.      
doDispatch 방법 기능 은 크게 다음 과 같 습 니 다.
먼저 요청 한 경로 에 따라 RequestMapping 의 주석 맵 을 통 해 HandlerMethod(즉,Controller 에 대응 하 는 방법)를 찾 은 다음 경로 에 대응 하 는 차단기 와 일치 하 며 HandlerMethod 와 차단기 가 HandlerExecutionChain 대상 을 구성 합 니 다.Handler ExecutionChain 대상 획득 은 Handler Mapping 인터페이스 에서 제공 하 는 방법 에서 얻 을 수 있 습 니 다.
HandlerExecutionChain 이 생 긴 후 handlerAdapter 대상 을 통 해 적합 한 처 리 를 하여 Model AndView 대상,HandlerMethod 내부 handle 을 얻 었 을 때 각종 HandlerMethodArgument Resolver 를 사용 하여 HandlerMethod 를 처리 하 는 매개 변 수 를 실현 하고 각종 HandlerMethodReturnValueHandler 를 사용 하여 클래스 처리 반환 값 을 실현 하 며 최종 반환 값 은 Model AndView 대상 으로 처리 되 었 습 니 다.이 기간 에 발생 한 이상 은 Handler Exception Resolver 인터페이스 구현 클래스 에 의 해 처 리 됩 니 다.
요약:본 고 는 주로 Dispatcher Servlet 과 그의 아버지 클래스 Framework Servlet 과 Http ServletBean 의 역할 을 분석 하고 자 한다.처리 되 돌아 오 기 를 요청 하 는 과정 에 대한 분석
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기