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