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

Spring 启动记录(9)

这个例子中的的MvcNamespaceHandler

Spring 启动记录(9)

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的实现类

Spring 启动记录(9)

 

Spring 启动记录(9)

上图就是解析BeanDefinition对象的流程图

 

 

转载于:https://my.oschina.net/u/867830/blog/825102

相关文章:

  • 2021-05-08
  • 2021-12-12
  • 2021-10-28
  • 2021-06-18
  • 2021-07-11
  • 2022-01-02
  • 2021-12-24
  • 2021-10-05
猜你喜欢
  • 2021-04-01
  • 2021-10-04
  • 2021-07-31
  • 2021-05-01
  • 2021-04-11
  • 2021-11-12
  • 2021-09-29
相关资源
相似解决方案