zoukankan      html  css  js  c++  java
  • Dubbo中对Spring配置标签扩展

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

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

    dubbo中所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
    下面我们就用dubbo为例来看如何实现对Spring配置的标签扩展。

     

    1、设计配置属性和JavaBean

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

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

    image

     

    ServiceBean类的关系图如下图:

     

    image

    2、编写XSD文件

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

    image

    以后面要用到的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,简单的方式就是去继承这两个类。

    image

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

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

    image

    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项目中,如下图:

    image

     

    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 配置具体启动服务(http://www.cnblogs.com/ghj1976/p/5320195.html

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

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
       
        <bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
        <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
       
    </beans>

    其中:

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

     

    参考:

    基于Spring可扩展Schema提供自定义配置支持
    http://blog.csdn.net/cutesource/article/details/5864562

  • 相关阅读:
    http/ip 协议
    shell脚本
    LoadRunner脚本编写
    【WebGL】《WebGL编程指南》读书笔记——第6章
    【WebGL】《WebGL编程指南》读书笔记——第5章
    【WebGL】《WebGL编程指南》读书笔记——第4章
    【WebGL】《WebGL编程指南》读书笔记——第3章
    【WebGL】《WebGL编程指南》读书笔记——第2章
    【移动支付】.NET微信扫码支付接入(模式二-NATIVE)
    【学车】学车笔记-科目二
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5379332.html
Copyright © 2011-2022 走看看