SpringMVC 소스 분석(2) DispatcherServlet의 초기화

6429 단어
DispatcherServlet의 초기화는 org입니다.springframework.web.context.ContextLoaderListener가 로드를 완료하고 나서야 시작했습니다.이때 WebApplicationContext(DAO, 서비스 등 포함)는 이미 시작되었다.
DispatcherServlet의 초기 프로세스는 주로
1. WebApplicationContext 모/자 컨테이너 유지 관리
2. 서브렛 정책 초기화
본문의 주요 내용
DispatcherServlet의 통합 아키텍처
DispatcherServlet 초기화 프로세스
1. DispatcherServlet의 상속 체계
DispatcherServlet은 액세스 포털인 일반 서브렛입니다.계승 체계를 이해하여 초기화 템플릿을 정리하기 편리하다.
2. DispatcherServlet 초기화 프로세스
2.1 init
public final void init() throws ServletException {

   // Set bean properties from init parameters.
   // Servlet        pvs   
   try {
      PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
      BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
      ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
      bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader));
      initBeanWrapper(bw);//bw  DispatcherServlet
      bw.setPropertyValues(pvs, true);
   }

   //      
   initServletBean();

   if (logger.isDebugEnabled()) {
      logger.debug("Servlet '" + getServletName() + "' configured successfully");
   }
}

2.2 initServletBean 메서드
protected final void initServletBean() throws ServletException {
      this.webApplicationContext = initWebApplicationContext();
      initFrameworkServlet();//      

}
   webApplicationContext ;   FrameworkServlet

2.3 initWebApplicationContext  

protected WebApplicationContext initWebApplicationContext() {
   WebApplicationContext wac = findWebApplicationContext();
   if (wac == null) {
      // No fixed context defined for this servlet - create a local one.
      WebApplicationContext parent =
            WebApplicationContextUtils.getWebApplicationContext(getServletContext());
      wac = createWebApplicationContext(parent);
   }

   if (!this.refreshEventReceived) {
      // Apparently not a ConfigurableApplicationContext with refresh support:
      // triggering initial onRefresh manually here.
      onRefresh(wac);////  DispatcherServlet.initStrategies  
   }

   if (this.publishContext) {
      // Publish the context as a servlet context attribute.
      String attrName = getServletContextAttributeName();
      getServletContext().setAttribute(attrName, wac);
      ...
      }
   }

   return wac;
}

protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) {
   Class> contextClass = getContextClass();
   ConfigurableWebApplicationContext wac =
         (ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
   wac.setParent(parent);//      
   wac.setServletContext(getServletContext());
   wac.setServletConfig(getServletConfig());
   wac.setNamespace(getNamespace());
   wac.setConfigLocation(getContextConfigLocation());
   //  DispatcherServlet.initStrategies  
   wac.addApplicationListener(new SourceFilteringListener(wac, new ContextRefreshListener()));
   postProcessWebApplicationContext(wac);
   wac.refresh();
   return wac;
}

private class ContextRefreshListener implements ApplicationListener {

   public void onApplicationEvent(ContextRefreshedEvent event) {
      FrameworkServlet.this.onApplicationEvent(event);
   }
}

2.5.initStrategies 메서드
protected void initStrategies(ApplicationContext context) {
   initMultipartResolver(context);
   initLocaleResolver(context);
   initThemeResolver(context);
   initHandlerMappings(context);
   initHandlerAdapters(context);
   initHandlerExceptionResolvers(context);
   initRequestToViewNameTranslator(context);
   initViewResolvers(context);
}

9개의 구성 요소를 초기화합니다.
구성 요소를 초기화하는 과정은 대체로 용기에서 가져오고 가져오지 못하면 getDefaultStrategy (ApplicationContext) 를 호출합니다.
context, Class strategyInterface)  。

      DispatcherServlet.properties

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
   org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
   org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
   org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
   org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
   org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
2.6.initHandlerMappings  

private void initHandlerMappings(ApplicationContext context) {
   this.handlerMappings = null;
   if (this.detectAllHandlerMappings) {
      // Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
      Map matchingBeans =
            BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
      if (!matchingBeans.isEmpty()) {
         this.handlerMappings = new ArrayList(matchingBeans.values());
         // We keep HandlerMappings in sorted order.
         OrderComparator.sort(this.handlerMappings);
      }
   }
   else {
...
   }

   }
}

spring mvc 용기에서handlerMapping 대상을handlerMappings 목록에 부여합니다.이러한 객체는 태그가 해결될 때 컨테이너에 자동으로 로드됩니다.구체적이다
2.7 initHandlerAdapters 메서드
initHandlerMappings와 완전히 일치합니다.
1~5년 동안 일한 자바 엔지니어 여러분을 환영합니다. 자바 고병발: 957734884, 그룹 내에서 무료 자바 구조 학습 자료(안에는 고가용, 고병발, 고성능 및 분포식, Jvm 성능 개선, Spring 원본, MyBatis, Netty, Redis, Kafka, Mysql, Zookeeper, Tomcat, Docker, Dubbo, Nginx 등 여러 가지 지식점의 구조 자료)가 있습니다.다시는'시간이 없다'는 말로 자신의 사상적 게으름을 감추지 마라! 젊을 때 힘껏 싸워 미래의 자신에게 설명하라!

좋은 웹페이지 즐겨찾기