zoukankan      html  css  js  c++  java
  • 【Dubbo】解析XML标签

    概述

      Dubbo版本:2.7.8

      下面是Dubbo服务提供端一个标准的XML配置

    <beans http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
     
    <dubbo:application name="demo-provider"/>
     
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
     
    <dubbo:protocol name="dubbo" port="20890"/>
    
     
    <bean id="demoService" class="org.apache.dubbo.samples.basic.impl.DemoServiceImpl"/>
     
    <dubbo:service interface="org.apache.dubbo.samples.basic.api.DemoService" ref="demoService"/>
    
    </beans>

    其中配置了 application、registry、protocol、service等节点参数和值

    那么Dubbo是怎样解析这些XML节点的呢?

    说明

      Dubbo使用 spring解析XML标签

      基于dubbo-config-spring项目内的 META-INF/spring.handlers 配置,Spring 在遇到 dubbo 名称空间时,会使用DubboNamespaceHandler类解析

      所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。

      在 ServiceConfig.export() 或 ReferenceConfig.get() 初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。

      然后将 URL 传给 协议扩展点,基于扩展点的 扩展点自适应机制,根据 URL 的协议头,进行不同协议的服务暴露或引用。

    代码

    1. 配置信息

    1. dubbo-config-spring项目
       
       
      resources-->META-INF-->dubbo.xsd : xml标签的schema
       
      resources-->META-INF-->spring.schemas : 指定xsd文件目录
       
      resources-->META-INF-->spring.handlers :指定xml标签解析类

    2. DubboNamespaceHandler

    dubbo-config-spring项目
     
     
     
    // xml标签解析类
     
    package org.apache.dubbo.config.spring.schema.DubboNamespaceHandler
     
     
     
    public class DubboNamespaceHandler extends NamespaceHandlerSupport implements ConfigurableSourceBeanMetadataElement {
     
     
     
    // 解析各个xml标签
     
    @Override
     
    public void init() {
     
     
    registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
     
    registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
     
    registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
     
    registerBeanDefinitionParser("config-center", new DubboBeanDefinitionParser(ConfigCenterBean.class, true));
     
    registerBeanDefinitionParser("metadata-report", new DubboBeanDefinitionParser(MetadataReportConfig.class, true));
     
    registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
     
    registerBeanDefinitionParser("metrics", new DubboBeanDefinitionParser(MetricsConfig.class, true));
     
    registerBeanDefinitionParser("ssl", new DubboBeanDefinitionParser(SslConfig.class, true));
     
    registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
     
    registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
     
    registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
     
    registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
     
    registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
     
    registerBeanDefinitionParser("annotation", new AnnotationBeanDefinitionParser());
     
    }
     
    }

    3. DubboBeanDefinitionParser

    package org.apache.dubbo.config.spring.schema
     
     
    // DubboBeanDefinitionParser 基于一对一属性映射,将 XML 标签解析为 Bean 对象。
     
    public class DubboBeanDefinitionParser implements BeanDefinitionParser {
     
     
    @Override
     
    public BeanDefinition parse(Element element, ParserContext parserContext) {
     
    return parse(element, parserContext, beanClass, required);
     
    }
  • 相关阅读:
    CB文件读入后输出中文乱码问题
    2019-ICPC-沈阳站打铁感想
    计蒜客习题:画图游戏(Havel-Hakimi定理)
    计蒜客练习题:接龙(带权并查集)
    搜索----Dungeon Master
    最短路 poj1502 MPI Maelstrom
    poj 3259 Wormholes
    Silver Cow Party
    Til the Cows Come Home
    Cow Contest
  • 原文地址:https://www.cnblogs.com/gossip/p/14334180.html
Copyright © 2011-2022 走看看