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