• 【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);
     
    }
  • 相关阅读:
    mongodb一个关键字对多个字段同时查询,mongodb $or $and查询
    用Supervisord管理Python进程
    ImportError No module named memcache
    eclipse项目显示标尺
    Eclipse 安装插件后不显示的解决办法
    Flutter入门到放弃笔记(一)--Mac电脑配置Flutter环境
    iOS 动态库、静态库相关
    iOS 获取手机后台音频状态以及类别
    Swift 懒加载
    Swift中@ojbc 重载用法
  • 原文地址:https://www.cnblogs.com/gossip/p/14334180.html
Copyright © 2020-2023  润新知