spring加载自定义命名空间【springmvc的【mvc:annotation-driven】配置】

spring加载自定义命名空间
具体步骤:
1、通过xml命名空间找到具体的解析处理器
2、根据localName定位到具体的解析器
3、解析具体的xml生成beandefinition注册到spring容器中


主要配置文件和类:
META-INF/spring.handlers
META-INF/spring.schemas
NamespaceHandler
BeanDefinitionParser
*.xsd

================【springmvc的【mvc:annotation-driven】配置】源码分析==============

BeanDefinitionParserDelegate.parseCustomElement(Element ele, BeanDefinition containingBd)//解析beanDefinition
 -->getNamespaceURI(ele)//根据解析的Element获取命名空间
 -->this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri)//根据命名空间获取NamespaceHandler
   -->DefaultNamespaceHandlerResolver.resolve(String namespaceUri)//根据classpath:META-INF/spring.handlers文件获取NamespaceHandler实例
     -->getHandlerMappings()//获取处理器映射关系(默认从classpath:META-INF/spring.handlers下获取)
-->PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation, this.classLoader);//加载本地的spring.handlers文件到内存中
-->CollectionUtils.mergePropertiesIntoMap(mappings, handlerMappings);//把Properties文件缓存到ConcurrentHashMap中
 -->handler.parse(ele, new ParserContext(this.readerContext, this, containingBd))//定位到具体的解析处理器实现部分生成beanDefinition注入容器中
-->NamespaceHandlerSupport.parse(Element element, ParserContext parserContext)//拿NamespaceHandlerSupport举一个例子
-->findParserForElement(element, parserContext)//获取解析器AnnotationDrivenBeanDefinitionParser(mvc:annotation-driven)
-->parserContext.getDelegate().getLocalName(element)//通过mvc:annotation-driven获取AnnotationDrivenBeanDefinitionParser并返回
-->AnnotationDrivenBeanDefinitionParser.parse(element, parserContext)//真正的解析在此
-->new RootBeanDefinition(RequestMappingHandlerMapping.class)//初始化RequestMappingHandlerMapping
-->readerContext.getRegistry().registerBeanDefinition(HANDLER_MAPPING_BEAN_NAME , handlerMappingDef)//注入spring容器中
-->MvcNamespaceUtils.registerCorsConfigurations(null, parserContext, source)//注入mvcCorsConfigurations

你可能感兴趣的:(spring源码学习)