您的位置:首页 > 编程语言 > Java开发

6.2 dubbo在spring中自定义xml标签源码解析

2017-10-02 13:27 746 查看
6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式。dubbo也是这样来实现的。



一 META_INF/dubbo.xsd

比较长,只列出<dubbo:applicaton>元素相关的。

1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
3             xmlns:beans="http://www.springframework.org/schema/beans"
4             xmlns:tool="http://www.springframework.org/schema/tool"
5             xmlns="http://code.alibabatech.com/schema/dubbo"
6             targetNamespace="http://code.alibabatech.com/schema/dubbo">
7
8     。。。
9
10    <xsd:complexType name="applicationType">
11         <xsd:attribute name="id" type="xsd:ID">
12             <xsd:annotation>
13                 <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>
14             </xsd:annotation>
15         </xsd:attribute>
16         <xsd:attribute name="name" type="xsd:string" use="required">
17             <xsd:annotation>
18                 <xsd:documentation><![CDATA[ The application name. ]]></xsd:documentation>
19             </xsd:annotation>
20         </xsd:attribute>
21         <xsd:attribute name="version" type="xsd:string">
22             <xsd:annotation>
23                 <xsd:documentation><![CDATA[ The application version. ]]></xsd:documentation>
24             </xsd:annotation>
25         </xsd:attribute>
26         <xsd:attribute name="owner" type="xsd:string">
27             <xsd:annotation>
28                 <xsd:documentation><![CDATA[ The application owner name (email prefix). ]]></xsd:documentation>
29             </xsd:annotation>
30         </xsd:attribute>
31         <xsd:attribute name="organization" type="xsd:string">
32             <xsd:annotation>
33                 <xsd:documentation><![CDATA[ The organization name. ]]></xsd:documentation>
34             </xsd:annotation>
35         </xsd:attribute>
36         <xsd:attribute name="architecture" type="xsd:string">
37             <xsd:annotation>
38                 <xsd:documentation><![CDATA[ The architecture. ]]></xsd:documentation>
39             </xsd:annotation>
40         </xsd:attribute>
41         <xsd:attribute name="environment" type="xsd:string">
42             <xsd:annotation>
43                 <xsd:documentation><![CDATA[ The application environment, eg: dev/test/run ]]></xsd:documentation>
44             </xsd:annotation>
45         </xsd:attribute>
46         <xsd:attribute name="compiler" type="xsd:string">
47             <xsd:annotation>
48                 <xsd:documentation><![CDATA[ The java code compiler. ]]></xsd:documentation>
49             </xsd:annotation>
50         </xsd:attribute>
51         <xsd:attribute name="logger" type="xsd:string">
52             <xsd:annotation>
53                 <xsd:documentation><![CDATA[ The application logger. ]]></xsd:documentation>
54             </xsd:annotation>
55         </xsd:attribute>
56         <xsd:attribute name="registry" type="xsd:string" use="optional">
57             <xsd:annotation>
58                 <xsd:documentation><![CDATA[ The application registry. ]]></xsd:documentation>
59             </xsd:annotation>
60         </xsd:attribute>
61         <xsd:attribute name="monitor" type="xsd:string" use="optional">
62             <xsd:annotation>
63                 <xsd:documentation><![CDATA[ The application monitor. ]]></xsd:documentation>
64             </xsd:annotation>
65         </xsd:attribute>
66         <xsd:attribute name="default" type="xsd:string" use="optional">
67             <xsd:annotation>
68                 <xsd:documentation><![CDATA[ Is default. ]]></xsd:documentation>
69             </xsd:annotation>
70         </xsd:attribute>
71     </xsd:complexType>
72
73     。。。
74
75     <xsd:element name="application" type="applicationType">
76         <xsd:annotation>
77             <xsd:documentation><![CDATA[ The application config ]]></xsd:documentation>
78         </xsd:annotation>
79     </xsd:element>
80
81     。。。
82
83 </xsd:schema>


与上一节完全相似。

二 META_INF/spring.schemas

1 http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd


与上一节完全相似。

三 DubboBeanDefinitionParser

代码较长,不再贴出来了,与上一节完全相似。

四 DubboNamespaceHandler

1 package com.alibaba.dubbo.config.spring.schema;
2
3 import com.alibaba.dubbo.common.Version;
4 import com.alibaba.dubbo.config.ApplicationConfig;
5 import com.alibaba.dubbo.config.ConsumerConfig;
6 import com.alibaba.dubbo.config.ModuleConfig;
7 import com.alibaba.dubbo.config.MonitorConfig;
8 import com.alibaba.dubbo.config.ProtocolConfig;
9 import com.alibaba.dubbo.config.ProviderConfig;
10 import com.alibaba.dubbo.config.RegistryConfig;
11 import com.alibaba.dubbo.config.spring.AnnotationBean;
12 import com.alibaba.dubbo.config.spring.ReferenceBean;
13 import com.alibaba.dubbo.config.spring.ServiceBean;
14
15 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
16
17 public class DubboNamespaceHandler extends NamespaceHandlerSupport {
18
19     static {
20         Version.checkDuplicate(DubboNamespaceHandler.class);
21     }
22
23     public void init() {
24         registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
25         registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
26         registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
27         registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
28         registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
29         registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
30         registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
31         registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
32         registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
33         registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
34     }
35 }


功能与上一节完全相似。这里可以看出,dubbo自定义了10个xml元素(也可以从xsd中看出)。从上边也可以看出,<dubbo:service>会被解析成ServiceBean,该bean极其重要。

五 META_INF/spring.handlers

1 http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler


与上一节完全相似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: