BeanDefinitionParserDelegate:
@Nullable
public BeanDefinition parseCustomElement(Element ele, @Nullable BeanDefinition containingBd) {
//解析节点的命名空间
String namespaceUri = getNamespaceURI(ele);
if (namespaceUri == null) {
return null;
}
//解析命名空间,得到一个命名空间处理器
//重点
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); //代码1
if (handler == null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
return null;
}
//开始解析
//主线 重点
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); //代码2
}
代码1,执行获取当前命名空间的命名空间处理器
DefaultNamespaceHandlerResolver:
public NamespaceHandler resolve(String namespaceUri) {
//获取所有的handlerMapping,即命名空间与对应NamespaceHandler实现的映射
Map<String, Object> handlerMappings = getHandlerMappings(); //代码2
// 我们案例中则为ContextNamespaceHandler
// http://www.springframework.org/schema/context -> org.springframework.context.config.ContextNamespaceHandler
Object handlerOrClassName = handlerMappings.get(namespaceUri);
if (handlerOrClassName == null) {
return null;
}
else if (handlerOrClassName instanceof NamespaceHandler) {
//假如获取到的对象为NamespaceHandler,则直接返回,不过一般获取的为类路径信息,即下面的分支
return