webx3的扩展点

以Template渲染服务为例子
  <!-- Template渲染服务。 -->
    <services:template xmlns="http://www.alibaba.com/schema/services/template/engines"
        searchExtensions="true">
        <velocity-engine templateEncoding="GBK" strictReference="false"
            path="/templates/${component}">
            <global-macros>
                <name>global/*.vm</name>
            </global-macros>
            <plugins>
                <vm-plugins:escape-support defaultEscape="html">
                    <vm-plugins:noescape>
                        <vm-plugins:if-matches pattern="^control\." />
                        <vm-plugins:if-matches pattern="^screen_placeholder" />
                        <vm-plugins:if-matches pattern="^stringEscapeUtil\.escape" />
                        <vm-plugins:if-matches pattern="^csrfToken\.(get)?hiddenField" />
                    </vm-plugins:noescape>
                </vm-plugins:escape-support>
            </plugins>
        </velocity-engine>
    </services:template>


services是root扩展点,template是对services的捐献,同时template的element也是扩展点,namespace:http://www.alibaba.com/schema/services/template/engines,详见template.xsd:

  <xsd:complexType name="TemplateServiceType">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="template-mapping" type="TemplateServiceEngineMappingType"
                minOccurs="0" maxOccurs="unbounded">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[
    将模板引擎和模板名后缀关联起来。
                    ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:element>
            <xsd:any namespace="http://www.alibaba.com/schema/services/template/engines" />
        </xsd:choice>
        <xsd:attribute name="defaultExtension" type="xsd:string" />
        <xsd:attribute name="searchExtensions" type="springext:booleanOrPlaceholder" />
        <xsd:attribute name="searchLocalizedTemplates" type="springext:booleanOrPlaceholder" />
        <xsd:attribute name="cacheEnabled" type="springext:booleanOrPlaceholder" />
        <xsd:attributeGroup ref="springext:identifiedTypeAttributeSubset" />
    </xsd:complexType>

    <xsd:complexType name="TemplateServiceEngineMappingType">
        <xsd:attribute name="extension" type="xsd:string" use="required" />
        <xsd:attribute name="engine" type="xsd:string" use="required" />
    </xsd:complexType>



template的属性:searchExtensions等。
template的elements:global-macros, plugins。
global-macros是一个list sting
plugins又是一个扩展点.vm-plugins是其中的一种捐献。

对应的xsd描述:
<xsd:complexType name="VelocityTemplateEngineType">
        <xsd:complexContent>
            <xsd:extension base="beans:identifiedType">
                <xsd:all>
                    <xsd:element name="global-macros" type="VelocityGlobalMacrosType" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation><![CDATA[
    装载全局宏(相对于path路径),可使用通配符。
                            ]]></xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="plugins" type="VelocityPluginsType" minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation><![CDATA[
    Velocity插件和事件处理器。
                            ]]></xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                    <xsd:element name="advanced-properties" type="VelocityPropertiesType"
                        minOccurs="0">
                        <xsd:annotation>
                            <xsd:documentation><![CDATA[
    Velocity高级设置,参见velocity文档:
      (http://velocity.apache.org/engine/releases/velocity-1.6.2/developer-guide.html#Velocity_Configuration_Keys_and_Values)
    和默认配置文件:org/apache/velocity/runtime/defaults/velocity.properties。
                            ]]></xsd:documentation>
                        </xsd:annotation>
                    </xsd:element>
                </xsd:all>
                <xsd:attribute name="path" type="xsd:string" default="/templates" />
                <xsd:attribute name="templateEncoding" type="xsd:string" default="UTF-8" />
                <xsd:attribute name="cacheEnabled" type="springext:booleanOrPlaceholder"
                    default="true" />
                <xsd:attribute name="modificationCheckInterval"
                    type="springext:integerOrPlaceholder" default="2" />
                <xsd:attribute name="strictReference" type="springext:booleanOrPlaceholder"
                    default="true" />
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>



其中的
 <xsd:element name="global-macros" type="VelocityGlobalMacrosType" minOccurs="0">
 <xsd:element name="plugins" type="VelocityPluginsType" minOccurs="0">

定义了element的名字和类型的映射关系,下面是type的描述:
 <xsd:complexType name="VelocityGlobalMacrosType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="VelocityPluginsType">
        <xsd:sequence>
            <xsd:any
                namespace="http://www.alibaba.com/schema/services/template/engines/velocity/plugins"
                minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

xsd:sequence表示list,xsd:any表示所有满足namespace="http://www.alibaba.com/schema/services/template/engines/velocity/plugins"都行。其实就是定义了一处扩展点。

二.VelocityEngineDefinitionParser类
再来看看VelocityEngineDefinitionParser如何来parser。
VelocityEngineDefinitionParser 继承了 AbstractSingleBeanDefinitionParser,但是要注意如果是顶级service要继承AbstractNamedBeanDefinitionParser,实现其getDefaultName方法。否则会抛出异常。

猜你喜欢

转载自san-yun.iteye.com/blog/1180497