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

  • 相关阅读:
    HDU4366 Successor 线段树+预处理
    POJ2823 Sliding Window 单调队列
    HDU寻找最大值 递推求连续区间
    UVA846 Steps 二分查找
    HDU3415 Max Sum of MaxKsubsequence 单调队列
    HDU时间挑战 树状数组
    UVA10168 Summation of Four Primes 哥德巴赫猜想
    UESTC我要长高 DP优化
    HDUChess 递推
    HDU4362 Dragon Ball DP+优化
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5379332.html
Copyright © 2011-2022 走看看