spring自定义标签

第一步:编写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 Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,981评论 19 139
  • 作者: 一字马胡 转载标志 【2017-11-17】 更新日志 导入 Spring框架的一大强大之处就是框架的设...
    一字马胡阅读 3,806评论 0 20
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,970评论 6 342
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,466评论 25 708
  • 说起周星驰,这个大家耳熟能详的名字,即使是身为90后,没有情真意切在当年的电影院看过他的电影,也为会为这位喜...
    司铁阅读 478评论 0 4