【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);
 
}

 

posted @ 2021-01-27 11:45    阅读(204)  评论(0编辑  收藏  举报