Spring BeanDefinitionParserDelegate 解析
1、DefaultBeanDefinitionDocumentReader持有BeanDefinitionParserDelegate,
调用BeanDefinitionParserDelegate做真正的解析工作
/**
* Parse the elements at the root level in the document:
* "import", "alias", "bean".
* @param root the DOM root element of the document
*/
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
if (delegate.isDefaultNamespace(root)) {
NodeList nl = root.getChildNodes();
for (int i = 0; i < nl.getLength(); i++) {
Node node = nl.item(i);
if (node instanceof Element) {
Element ele = (Element) node;
// 解析 xsd http://www.springframework.org/schema/beans对应的标签 <beans>
if (delegate.isDefaultNamespace(ele)) {
parseDefaultElement(ele, delegate);
}
//解析其他xsd对应的如:
//http://www.springframework.org/schema/mvc <mvc:annotation-driven />
else {
delegate.parseCustomElement(ele);
}
}
}
}
else {
delegate.parseCustomElement(root);
}
}
2、解析其他xsd的handler
如:http://www.springframework.org/schema/mvc
public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) {
//现获取到uri:http://www.springframework.org/schema/mvc
String namespaceUri = getNamespaceURI(ele);
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
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));
}
这是XMLReaderContext中所有handler的mapping
这个例子中的的MvcNamespaceHandler
public class MvcNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("redirect-view-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("status-controller", new ViewControllerBeanDefinitionParser());
registerBeanDefinitionParser("view-resolvers", new ViewResolversBeanDefinitionParser());
registerBeanDefinitionParser("tiles-configurer", new TilesConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("freemarker-configurer", new FreeMarkerConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("velocity-configurer", new VelocityConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("groovy-configurer", new GroovyMarkupConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("script-template-configurer", new ScriptTemplateConfigurerBeanDefinitionParser());
registerBeanDefinitionParser("cors", new CorsBeanDefinitionParser());
}
}
这些初始化都持有了内部的key都是对应了spring-mvc-4.0.xsd中声明的 element(如<xsd:element name="interceptors">)等;
其实就是通过Dom对象找到对应xsd,然后找到对应的handler,进而通过handler中持有的BeanDefinitionParser的实现类
上图就是解析BeanDefinition对象的流程图
转载于:https://my.oschina.net/u/867830/blog/825102