說在前面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
說到最後
本次源碼解析僅表明我的觀點,僅供參考。