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://www.cnblogs.com/ghj1976/p/5379332.html#commentform


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM