博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo中对Spring配置标签扩展
阅读量:6002 次
发布时间:2019-06-20

本文共 4378 字,大约阅读时间需要 14 分钟。

Spring提供了可扩展Schema的支持,完成一个自定义配置一般需要以下步骤:

  • 设计配置属性和JavaBean
  • 编写XSD文件
  • 编写NamespaceHandler和BeanDefinitionParser完成解析工作
  • 编写spring.handlers和spring.schemas串联起所有部件
  • 在Bean文件中应用

dubbo中所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。 

下面我们就用dubbo为例来看如何实现对Spring配置的标签扩展。

 

1、设计配置属性和JavaBean

我们首先当然得设计好配置项,并通过JavaBean来建模。

以Dubbo的ServiceBean为例,这里定义的了dubbo每个服务的信息。

 

ServiceBean类的关系图如下图:

 

2、编写XSD文件

XSD文件所在的位置在dubbo-config-spring项目中,如下图:

以后面要用到的dubbo:service为例,:

<xsd:element name="service" type="serviceType"> 

        <xsd:annotation> 
            <xsd:documentation><![CDATA[ Export service config ]]></xsd:documentation> 
        </xsd:annotation> 
</xsd:element>

serviceType类型的定义如下:

    <xsd:complexType name="serviceType"> 

        <xsd:complexContent> 
            <xsd:extension base="abstractServiceType"> 
                <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
                    <xsd:element ref="method" minOccurs="0" maxOccurs="unbounded" /> 
                    <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded" /> 
                    <xsd:element ref="beans:property" minOccurs="0" maxOccurs="unbounded" /> 
                </xsd:choice> 
                <xsd:attribute name="interface" type="xsd:token" use="required"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ Defines the interface to advertise for this service in the service registry. ]]></xsd:documentation> 
                        <xsd:appinfo> 
                            <tool:annotation> 
                                <tool:expected-type type="java.lang.Class"/> 
                            </tool:annotation> 
                        </xsd:appinfo> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:attribute name="ref" type="xsd:string" use="optional"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ The service implementation instance bean id. ]]></xsd:documentation> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:attribute name="class" type="xsd:string" use="optional"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ The service implementation class name. ]]></xsd:documentation> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:attribute name="path" type="xsd:string" use="optional"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ The service path. ]]></xsd:documentation> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:attribute name="provider" type="xsd:string" use="optional"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ Deprecated. Replace to protocol. ]]></xsd:documentation> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:attribute name="generic" type="xsd:string" use="optional"> 
                    <xsd:annotation> 
                        <xsd:documentation><![CDATA[ Generic service. ]]></xsd:documentation> 
                    </xsd:annotation> 
                </xsd:attribute> 
                <xsd:anyAttribute namespace="##other" processContents="lax" /> 
            </xsd:extension> 
        </xsd:complexContent> 
    </xsd:complexType>

比如其中的 <xsd:attribute name="ref" type="xsd:string" use="optional"> 对应的 string类型的配置项 ref。

 

 

3、编写NamespaceHandler和BeanDefinitionParser完成解析工作

要完成解析工作,会用到NamespaceHandler和BeanDefinitionParser这两个概念。具体说来NamespaceHandler会根据schema和节点名找到某个BeanDefinitionParser,然后由BeanDefinitionParser完成具体的解析工作。因此需要分别完成NamespaceHandler和BeanDefinitionParser的实现类,Spring提供了默认实现类NamespaceHandlerSupport和AbstractSingleBeanDefinitionParser,简单的方式就是去继承这两个类。

如上图,dubbo的 NamespaceHandler 文件在 com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler  。

Handler 定义了每个配置节解析的对象,如下图代码。

DubboBeanDefinitionParser 定义也在这个目录下。

 

4、编写spring.handlers和spring.schemas串联起所有部件

上面几个步骤走下来会发现开发好的handler与xsd还没法让应用感知到,就这样放上去是没法把前面做的工作纳入体系中的,spring提供了spring.handlers和spring.schemas这两个配置文件来完成这项工作,这两个文件需要我们自己编写并放入META-INF文件夹中,这两个文件的地址必须是META-INF/spring.handlers和META-INF/spring.schemas,spring会默认去载入它们。

这两个文件,在dubbo项目中,是在dubbo-config-spring项目中,如下图:

 

spring.handlers 文件的内容如下:

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

以上表示当使用到名为"http://code.alibabatech.com/schema/dubbo"的schema引用时,会通过com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler 来完成解析 

spring.schemas 文件的内容如下:

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

以上标示载入的xsd文件的位置。

 

5、在Bean文件中应用

Dubbo的Spring的配置文件来自哪里,请参考这篇文章:

Dubbo 通过Spring 配置具体启动服务()

以dubbo-demo-provider为例,它的Spring配置文件 dubbo-demo-provider.xml内容如下:

<beans xmlns=" 

    xmlns:xsi=" 
    xmlns:dubbo=" 
    xsi:schemaLocation="  
     > 
    
    <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" /> 
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> 
    
</beans>

其中:

  • xmlns:dubbo=" 是用来指定自定义schema,
  • xsi:schemaLocation用来指定xsd文件。
  • <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" /> 是一个具体的自定义配置使用实例。

 

参考:

基于Spring可扩展Schema提供自定义配置支持 

 

 
 转载:http://www.cnblogs.com/ghj1976/p/5379332.html#commentform
你可能感兴趣的文章
Git 常用命令
查看>>
软件架构(读书笔记2)
查看>>
pom.xml详解
查看>>
Git分支
查看>>
js中获得项目工程名路径
查看>>
css选择器
查看>>
python3网络爬虫学习——基本库的使用(1)
查看>>
js数组去重(多种方法)
查看>>
python 爬取乌云所有厂商名字,url,漏洞总数 并存入数据库
查看>>
AAPT2 error: check logs for details 问题的终究修复
查看>>
AIR 配置文件(*-app.xml)说明
查看>>
第二次作业
查看>>
php脚本运行shell命令
查看>>
禁止Home键跟返回键的使用
查看>>
Unable to connect to MKS;Too many scoket connect attempts;giving up
查看>>
winfrom 进程
查看>>
boost-同步-锁的守护
查看>>
Android开发自学笔记(Android Studio)—4.5 ProgressBar及其子类
查看>>
Windows 修改个性化时间显示
查看>>
vcenter安装错误The DSN is pointing to anunspported ODBC driver...
查看>>