微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 ,在解析完具体配置后,需要调用它们对应的方法进行初始化

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐