Nodenode=nl.item(i);
if(nodeinstanceofElement){
Elementele=(Element)node;
if(delegate.isDefaultNamespace(ele)){
parseDefaultElement(ele,delegate);
}
else{
delegate.parseCustomElement(ele);
}
}
}
}
else{
//自定义标签
delegate.parseCustomElement(root);
}
}
还是委托BeanDefinitionParserDelegate处理:
publicBeanDefinitionparseCustomElement(Elementele){
returnparseCustomElement(ele,null);
}
publicBeanDefinitionparseCustomElement(Elementele,BeanDefinitioncontainingBd){
//获取uri
StringnamespaceUri=getNamespaceURI(ele);
//根据uri获取处理handler
NamespaceHandlerhandler=this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if(ndler==null){
error("UnabletolocateSpringNamespaceHandlerforXMLschemanamespace["+namespaceUri+"]",ele);
returnnull;
}
//解析标签,返回对应的beanDefinition
returnhandler.parse(ele,newParserContext(this.readerContext,this,containingBd));
}
getNamespaceHandlerResolver()-resolve
//DefaultNamespaceHandlerResolver
//DefaultNamespaceHandlerResolver
publicNamespaceHandlerresolve(StringnamespaceUri){
//获取META-INF/spring.handlers所有配置的namespace的handler
MaphandlerMappings=getHandlerMappings();
//获取到自定义标签解析的handler
ObjecthandlerOrClassName=handlerMappings.get(namespaceUri);
if(handlerOrClassName==null){
returnnull;
}
elseif(handlerOrClassNameinstanceofNamespaceHandler){
return(NamespaceHandler)handlerOrClassName;
}
else{
StringclassName=(String)handlerOrClassName;
try{
Class
>handlerClass=ClassUtils.forName(className,this.classLoader);
//如果不是NamespaceHandle的子类的话,抛异常
if(!
NamespaceHandler.class.isAssignableFrom(handlerClass)){
thrownewFatalBeanException("Class["+className+"]fornamespace["+namespaceUri+
"]doesnotimplementthe["+NamespaceHandler.class.getName()+"]interface");
}
//实例化NamespaceHandler
NamespaceHandlernamespaceHandler=(NamespaceHandler)BeanUtils.instantiateClass(handlerClass);
//调用初始化注册beanDefinitionParser
namespaceHandler.init();
handlerMappings.put(namespaceUri,namespaceHandler);
returnnamespaceHandler;
}
catch(ClassNotFoundExceptionex){
thrownewFatalBeanException("NamespaceHandlerclass["+className+"]fornamespace["+
namespaceUri+"]notfound",ex);
}
catch(LinkageErrorerr){
thrownewFatalBeanException("InvalidNamespaceHandlerclass["+className+"]fornamespace["+
namespaceUri+"]:
problemwithhandlerclassfileordependentclass",err);
}
}
}
//获取META-INF/spring.handlers所有配置的namespace的handler
privateMapgetHandlerMappings(){
if(this.handlerMappings==null){
synchronized(this){
if(this.handlerMappings==null){
try{
//handlerMappingsLocation默认是META-INF/spring.handlers
Propertiesmappings=
PropertiesLoaderUtils.loadAllProperties(this.handlerMappingsLocation,this.classLoader);
if(logger.isDebugEnabled()){
logger.debug("LoadedNamespaceHandlermappings:
"+mappings);
}
MaphandlerMappings=newConcurrentHashMap();
CollectionUtils.mergePropertiesIntoMap(mappings,handlerMappings);
this.handlerMappings=handlerMappings;
}
catch(IOExceptionex){
thrownewIllegalStateException(
"UnabletoloadNamespaceHandlermappingsfromlocation["+this.handlerMappingsLocation+"]",ex);
}
}
}
}
returnthis.handlerMappings;
}
到这里获取到处理自定义标签的NamespaceHandler。
NamespaceHandler-parse
//NamespaceHandlerSupport
publicBeanDefinitionparse(Elementelement,ParserContextparserContext){
returnfindParserForElement(element,parserContext).parse(element,parserContext);
}
//获取对应的beanDefinitionParse来解析对应的标签
privateBeanDefinitionParserfindParserForElement(Elementelement,ParserContextparserContext){
StringlocalName=parserContext.getDelegate().getLocalName(element);
//this.parsers需要我们在NamespaceHandler的init注册进来
BeanDefinitionParserparser=this.parsers.get(localName);
if(parser==null){
parserContext.getReaderContext().fatal(
"CannotlocateBeanDefinitionParserforelement["+localName+"]",element);
}
returnparser;
}
//NamespaceHandler的init注册自定义标签的beanDefinitionParse
protectedfinalvoidregisterBeanDefinitionParser(StringelementName,BeanDefinitionParserparser){
this.parsers.put(elementName,parser);
}
看下BeanDefinition的parser方法:
//AbstractBeanDefinitionParser
publicfinalBeanDefinitionparse(Elementelement,ParserContextparserContext){
//子类继承覆盖parseInternal完成解析BeanDefinition
AbstractBeanDefinitiondefinition=parseInternal(element,parserContext);
if(definition!
=null&&!
parserContext.isNested()){
try{
//bean的id,可以通过覆盖shouldGenerateId返回true,选择spring自己生成,要不然就自定义标签里面自己提供一个id
Stringid=resolveId(element,definition,parserContext);
if(!
StringUtils.hasText(id)){
parserContext.getReaderContext().error(
"Idisrequiredforelement'"+parserContext.getDelegate().getLocalName(element)
+"'whenusedasatop-leveltag",element);
}
String[]aliases=newString[0];
Stringname=element.getAttribute(NAME_ATTRIBUTE);
if(StringUtils.hasLength(name)){
aliases=StringUtils.trimArrayElements(StringUmaDelimitedListToStringArray(name));
}
BeanDefinitionHolderholder=newBeanDefinitionHolder(definition,id,aliases);
//注册beanDefinition到spring
registerBeanDefinition(holder,parserContext.getRegistry());
if(shouldFireEvents()){
BeanComponentDefinitioncomponentDefinition=newBeanComponentDefinition(holder);
postProcessComponentDefinition(componentDefinition);
parserContext.registerComponent(