springmvc源碼解析MvcNamespaceHandler之 二

說在前面web

本次主要介紹springmvc配置解析。更多源碼解析文章請關注「天河聊技術」微信公衆號。spring

 

springmvc配置解析跨域

接着上次,進入到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#parse這一行微信

//     獲取返回值handler ->
      ManagedList<?> returnValueHandlers = getReturnValueHandlers(element, context);

進入到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#getReturnValueHandlersmvc

private ManagedList<?> getReturnValueHandlers(Element element, ParserContext context) {
   Element handlers = DomUtils.getChildElementByTagName(element, "return-value-handlers");
   return (handlers != null ? extractBeanSubElements(handlers, context) : null);
}

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#getAsyncTimeoutapp

private String getAsyncTimeout(Element element) {
   Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
   return (asyncElement != null ? asyncElement.getAttribute("default-timeout") : null);
}

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#getAsyncExecutorcors

private RuntimeBeanReference getAsyncExecutor(Element element) {
//    註冊異步執行器
      Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
      if (asyncElement != null && asyncElement.hasAttribute("task-executor")) {
         return new RuntimeBeanReference(asyncElement.getAttribute("task-executor"));
      }
      return null;
   }

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#getCallableInterceptors異步

private ManagedList<?> getCallableInterceptors(Element element, Object source, ParserContext context) {
      ManagedList<Object> interceptors = new ManagedList<Object>();
      Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
      if (asyncElement != null) {
//       註冊異步支持回調攔截器
         Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "callable-interceptors");
         if (interceptorsElement != null) {
            interceptors.setSource(source);
            for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
               BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
               beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
               interceptors.add(beanDef);
            }
         }
      }
      return interceptors;
   }

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#getDeferredResultInterceptorsasync

private ManagedList<?> getDeferredResultInterceptors(Element element, Object source, ParserContext context) {
      ManagedList<Object> interceptors = new ManagedList<Object>();
      Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
      if (asyncElement != null) {
//       註冊默認延遲結果攔截器
         Element interceptorsElement = DomUtils.getChildElementByTagName(asyncElement, "deferred-result-interceptors");
         if (interceptorsElement != null) {
            interceptors.setSource(source);
            for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
               BeanDefinitionHolder beanDef = context.getDelegate().parseBeanDefinitionElement(converter);
               beanDef = context.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
               interceptors.add(beanDef);
            }
         }
      }
      return interceptors;
   }

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#addRequestBodyAdviceui

protected void addRequestBodyAdvice(RootBeanDefinition beanDef) {
   if (jackson2Present) {
      beanDef.getPropertyValues().add("requestBodyAdvice",
            new RootBeanDefinition(JsonViewRequestBodyAdvice.class));
   }
}

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#addResponseBodyAdvice

protected void addResponseBodyAdvice(RootBeanDefinition beanDef) {
   if (jackson2Present) {
      beanDef.getPropertyValues().add("responseBodyAdvice",
            new RootBeanDefinition(JsonViewResponseBodyAdvice.class));
   }
}

往上返回到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerDefaultComponents

public static void registerDefaultComponents(ParserContext parserContext, Object source) {
//    註冊BeanNameUrlHandlerMapping bean定義 ->
      registerBeanNameUrlHandlerMapping(parserContext, source);
//    註冊HttpRequestHandlerAdapter bean定義 ->
      registerHttpRequestHandlerAdapter(parserContext, source);
//    註冊SimpleControllerHandlerAdapter bean定義 ->
      registerSimpleControllerHandlerAdapter(parserContext, source);
//    註冊HandlerMappingIntrospector bean定義 ->
      registerHandlerMappingIntrospector(parserContext, source);
   }

進入到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerBeanNameUrlHandlerMapping

private static void registerBeanNameUrlHandlerMapping(ParserContext context, Object source) {
      if (!context.getRegistry().containsBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME)){
//       註冊默認handleMapping組件bean定義
         RootBeanDefinition mappingDef = new RootBeanDefinition(BeanNameUrlHandlerMapping.class);
         mappingDef.setSource(source);
         mappingDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         mappingDef.getPropertyValues().add("order", 2);    // consistent with WebMvcConfigurationSupport
//       註冊跨域配置bean定義 ->
         RuntimeBeanReference corsRef = MvcNamespaceUtils.registerCorsConfigurations(null, context, source);
         mappingDef.getPropertyValues().add("corsConfigurations", corsRef);
         context.getRegistry().registerBeanDefinition(BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME, mappingDef);
         context.registerComponent(new BeanComponentDefinition(mappingDef, BEAN_NAME_URL_HANDLER_MAPPING_BEAN_NAME));
      }
   }

進入到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerCorsConfigurations

public static RuntimeBeanReference registerCorsConfigurations(
         Map<String, CorsConfiguration> corsConfigurations, ParserContext context, Object source) {

//    mvcCorsConfigurations 跨域支持bean定義解析
      if (!context.getRegistry().containsBeanDefinition(CORS_CONFIGURATION_BEAN_NAME)) {
         RootBeanDefinition corsDef = new RootBeanDefinition(LinkedHashMap.class);
         corsDef.setSource(source);
         corsDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         if (corsConfigurations != null) {
            corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
         }
//       註冊mvcCorsConfigurations bean定義
         context.getReaderContext().getRegistry().registerBeanDefinition(CORS_CONFIGURATION_BEAN_NAME, corsDef);
         context.registerComponent(new BeanComponentDefinition(corsDef, CORS_CONFIGURATION_BEAN_NAME));
      }
      else if (corsConfigurations != null) {
         BeanDefinition corsDef = context.getRegistry().getBeanDefinition(CORS_CONFIGURATION_BEAN_NAME);
         corsDef.getConstructorArgumentValues().addIndexedArgumentValue(0, corsConfigurations);
      }
      return new RuntimeBeanReference(CORS_CONFIGURATION_BEAN_NAME);
   }

往上返回到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerHttpRequestHandlerAdapter

private static void registerHttpRequestHandlerAdapter(ParserContext context, Object source) {
      if (!context.getRegistry().containsBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME)) {
//       註冊默認handlerAdapter組件bean定義
         RootBeanDefinition adapterDef = new RootBeanDefinition(HttpRequestHandlerAdapter.class);
         adapterDef.setSource(source);
         adapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         context.getRegistry().registerBeanDefinition(HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME, adapterDef);
         context.registerComponent(new BeanComponentDefinition(adapterDef, HTTP_REQUEST_HANDLER_ADAPTER_BEAN_NAME));
      }
   }

往上返回到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerSimpleControllerHandlerAdapter

private static void registerSimpleControllerHandlerAdapter(ParserContext context, Object source) {
      if (!context.getRegistry().containsBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME)) {
//       註冊默認單一控制器handlerAdapter組件bean定義
         RootBeanDefinition beanDef = new RootBeanDefinition(SimpleControllerHandlerAdapter.class);
         beanDef.setSource(source);
         beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         context.getRegistry().registerBeanDefinition(SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME, beanDef);
         context.registerComponent(new BeanComponentDefinition(beanDef, SIMPLE_CONTROLLER_HANDLER_ADAPTER_BEAN_NAME));
      }
   }

往上返回到這個方法org.springframework.web.servlet.config.MvcNamespaceUtils#registerHandlerMappingIntrospector

private static void registerHandlerMappingIntrospector(ParserContext parserContext, Object source) {
      if (!parserContext.getRegistry().containsBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)){
//       註冊默認內省handlerMapping組件bean定義
         RootBeanDefinition beanDef = new RootBeanDefinition(HandlerMappingIntrospector.class);
         beanDef.setSource(source);
         beanDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
         beanDef.setLazyInit(true);
         parserContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME, beanDef);
         parserContext.registerComponent(new BeanComponentDefinition(beanDef, HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME));
      }
   }

往上返回到這個方法org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser#parse

 

說到最後

本次源碼解析僅表明我的觀點,僅供參考。

相關文章
相關標籤/搜索