Dubbo八: XML 配置

1. 概述

dubbo 提供的几种方式中,XML 配置肯定是大家最熟悉的方式。

如果胖友不熟悉,可以查看如下文档:

XML 配置,自定义 <dubbo: /> 标签,基于 Spring XML 进行解析。如果不了解的胖友,可以查看如下文档:

2. 定义

2.1 sprng.schemas

dubbo 在 dubbo-spring-config 的 META-INF/spring.schemas 定义如下:

http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=meta-inf/dubbo.xsd
  • xmlns 为 http://code.alibabatech.com/schema/dubbo
  • xsd 为 meta-inf/dubbo.xsd

2.2 dubbo.xsd

dubbo.xsd 定义如下:

dubbo.xsd

  • <xsd:element name="" /> ,定义了元素的名称。例如,<xsd:element name="application" /> 对应 <dubbo:application /> 。
  • <xsd:element type="" /> ,定义了内建数据类型的名称。例如,<xsd:element type="applicationType" /> 对应 <xsd:complexType name="applicationType" /> 。
  • <xsd:complexType name=""> ,定义了复杂类型。例如 <xsd:complexType name="applicationType" /> 如下:

applicationType

2.3 spring.handlers

spring.handlers 定义如下:

http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.dubboNamespaceHandler
  • 定义了 dubbo 的 XML Namespace 的处理器 dubboNamespaceHandler 。

2.4 dubboNamespaceHandler

com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler ,实现 org.springframework.beans.factory.xml.NamespaceHandlerSupport 抽象类dubbo 的 XML Namespace 的处理器。

在 #init() 方法,定义了每个 <xsd:element /> 对应的 org.springframework.beans.factory.xml.BeanDeFinitionParser ,代码如下:

@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("monitor", new dubboBeanDeFinitionParser(MonitorConfig.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()); // 废弃
}
  • 细心的胖友,会看到 service 标签使用的是 ServiceBean ,而不是 ServiceConfigreference 表示用的是 ReferenceBean ,因为无论是 ServiceConfig 还是 ReferenceBean ,在解析完具体配置后,需要调用它们对应的方法进行初始化

相关文章

在网络请求时,总会有各种异常情况出现,我们需要提前处理这...
作者:宇曾背景软件技术的发展历史,从单体的应用,逐渐演进...
hello,大家好呀,我是小楼。最近一个技术群有同学at我,问我...
 一个软件开发人员,工作到了一定的年限(一般是3、4年左右...
当一个服务调用另一个远程服务出现错误时的外观Dubbo提供了多...
最近在看阿里开源RPC框架Dubbo的源码,顺带梳理了一下其中用...