Spring提供了可擴展Schema的支持,完成一個自定義配置通常須要如下步驟:html
dubbo中全部dubbo的標籤,都統一用DubboBeanDefinitionParser進行解析,基於一對一屬性映射,將XML標籤解析爲Bean對象。
下面咱們就用dubbo爲例來看如何實現對Spring配置的標籤擴展。java
咱們首先固然得設計好配置項,並經過JavaBean來建模。spring
以Dubbo的ServiceBean爲例,這裏定義的了dubbo每一個服務的信息。app
ServiceBean類的關係圖以下圖:ide
XSD文件所在的位置在dubbo-config-spring項目中,以下圖:ui
之後面要用到的dubbo:service爲例,:this
<xsd:element name="service" type="serviceType">
<xsd:annotation>
<xsd:documentation><![CDATA[ Export service config ]]></xsd:documentation>
</xsd:annotation>
</xsd:element>spa
serviceType類型的定義以下:.net
<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。
要完成解析工做,會用到NamespaceHandler和BeanDefinitionParser這兩個概念。具體說來NamespaceHandler會根據schema和節點名找到某個BeanDefinitionParser,而後由BeanDefinitionParser完成具體的解析工做。所以須要分別完成NamespaceHandler和BeanDefinitionParser的實現類,Spring提供了默認實現類NamespaceHandlerSupport和AbstractSingleBeanDefinitionParser,簡單的方式就是去繼承這兩個類。
如上圖,dubbo的 NamespaceHandler 文件在 com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler 。
Handler 定義了每一個配置節解析的對象,以下圖代碼。
DubboBeanDefinitionParser 定義也在這個目錄下。
上面幾個步驟走下來會發現開發好的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文件的位置。
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>
其中:
參考:
基於Spring可擴展Schema提供自定義配置支持
http://blog.csdn.net/cutesource/article/details/5864562