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(八): XML 配置

  • <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" /> 如下:

Dubbo(八): XML 配置

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 ,而不是 ServiceConfig ,reference 表示用的是 ReferenceBean ,因为无论是 ServiceConfig 还是 ReferenceBean ,在解析完具体配置后,需要调用它们对应的方法进行初始化
上一篇:解析源码---结合@ServletComponentScan与@WebServlet,@WebFilter,@WebListener注册servlet,filter,listener


下一篇:Spring包扫描机制详解