美文网首页
spring自定义标签

spring自定义标签

作者: 若尘0328 | 来源:发表于2017-11-21 13:57 被阅读26次
第一步:编写xsd文件
首先要定义xml的约束文件,本文使用xsd约束而不是dtd, META-INF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://code.ruochentech.com/schema/dubbo"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://code.ruochentech.com/schema/dubbo">
    <xsd:element name="registry">
        <xsd:complexType>
            <xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="address" type="xsd:string"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="reference">
        <xsd:complexType>
            <xsd:attribute name="id" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="interface" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="loadbalance" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="protocol">
        <xsd:complexType>
            <xsd:attribute name="name" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="port" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="host" type="xsd:string"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="service">
        <xsd:complexType>
            <xsd:attribute name="interface" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="ref" type="xsd:string"></xsd:attribute>
            <xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>
特别注意: 自定义的xsd文件头
第二步:编写spring.schemas文件

红框中的内容是自定义的内容。但是这两个值是一一对应的,spring读取xml文件内容的时候会校验这个xsd文件,默认去META-INF路径去找spring.schemas文件,spring.schemas文件中内容如下,

http\://code.ruochentech.com/schema/dubbo/soa.xsd=META-INF/soa.xsd
第三步:配置spring.handlers文件
http\://code.ruochentech.com/schema/dubbo=com.yonyou.soa.parser.SOANamespaceHandler
第四步:编写自定义标签解析类的初始化类
public class SOANamespaceHandler extends NamespaceHandlerSupport {
    public void init() {
        registerBeanDefinitionParser("registry",new RegistryBeanDefinitionParser(Registry.class));
        registerBeanDefinitionParser("reference",new ReferenceBeanDefinitionParser(Reference.class));
        registerBeanDefinitionParser("protocol",new ProtocolBeanDefinitionParser(Protocol.class));
        registerBeanDefinitionParser("service",new ServiceBeanDefinitionParser(Registry.class));
    }
}
第五步:自定义标签解析类(以xsd文件中registry标签解析为例)
public class RegistryBeanDefinitionParser implements BeanDefinitionParser {
    private Class<?> beanClass;
    public RegistryBeanDefinitionParser(Class<?> beanClass){
        this.beanClass=beanClass;
    }
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        RootBeanDefinition rootBeanDefinition=new RootBeanDefinition();
        rootBeanDefinition.setBeanClass(beanClass);
        rootBeanDefinition.setLazyInit(false);
        String protocol = element.getAttribute("protocol");
        String address = element.getAttribute("address");
        rootBeanDefinition.getPropertyValues().addPropertyValue("protocol",protocol);
        rootBeanDefinition.getPropertyValues().addPropertyValue("address",address);
        return rootBeanDefinition;
    }
}
第六步:测试
6.1配置xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ruochen="http://code.ruochentech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
       http://code.ruochentech.com/schema/dubbo http://code.ruochentech.com/schema/dubbo/soa.xsd"
       default-lazy-init="true">
    <bean id="testServiceImpl" class="com.yonyou.soa.test.TestServiceImpl"></bean>
    <ruochen:registry address="127.0.0.1:6379" protocol="redis"></ruochen:registry>
    <ruochen:reference id="testService" protocol="http" interface="com.yonyou.soa.test.TestService" loadbalance="random"></ruochen:reference>
    <ruochen:protocol name="http" host="127.0.0.1" port="27017"></ruochen:protocol>
</beans>
特别注意: 测试xml文件注意点

demo地址:https://github.com/ruochen0328/soa.git

相关文章

  • Spring源码分析-bean的解析(3)

    Spring源码分析-bean的解析(3) 当前版本 Spring 4.3.8 自定义标签的解析 自定义标签使用 ...

  • Spring4 自定义标签解析源码

    介绍 Spring将标签解析分为自定义标签解析和默认标签解析。 自定义标签解析开始位置 BeanDefinitio...

  • Spring的自定义标签

    Spring为自定义xml标签加载提供了扩展。用户可自定义标签并注册到Spring的bean容器中。实现较为复杂的...

  • spring解析自定义标签

    title: spring解析自定义标签tags: spring,源码grammar_cjkRuby: true ...

  • Spring 事务解析过程

    使用Spring的事务需要在xml配置 tx是Spring的自定义标签,该自定义标签的处理类为 从上面的代码可知,...

  • dubbo服务导出

    dubbo版本:2.7.2 一、spring解析自定义扩展标签。 spring分析xml节点的可以看出对于自定义命...

  • FreeMarker自定义标签

    freemarker 自定义标签 有两种方法,一种是Spring注解添加自定义标签 一种的编码添加自定义标签 第...

  • 2.1 dubbo自定义标签

    dubbo的自定义的spring标签通过DubboNamespaceHandler继承NamespaceHandl...

  • Spring源码解析(六)-解析bean标签

    Spring版本 5.2.5.RELEASE 参考 学习Spring源码(二)自定义标签属性 源码解读 在Spri...

  • 【Dubbo】Spring融合

    Dubbo和Spring结合使用了大量的自定义标签。dubbo正是通过这些标签和Spring融合在一起,实现了服务...

网友评论

      本文标题:spring自定义标签

      本文链接:https://www.haomeiwen.com/subject/ogiivxtx.html