zoukankan      html  css  js  c++  java
  • dubbo源码学习(二) : spring 自定义标签

    做dubbo的配置时很容易发现,dubbo有一套自己的标签,提供给开发者配置,其实每一个标签对应着一个 实体,在容器启动的时候,dubbo会对所有的配置进行解析然后将解析后的内容设置到实体里,最终dubbo会根据实体中的值生成贯穿全局的统一URL。利用自定义标签使配置简单明了化,与spring完美融合。

    下面自己写一个自定义标签,主要需要如下 几个步骤:

    1、编写实体类

    2、编写Parser解析类

    3、编写NameSpaceHandle类

    4、配置spring.handlers

    5、配置spring.schemas

    6、配置customTag .xsd

    标签实体类如下:

    public class CustomTag {

        private String id;

        private String name;

        private Integer age;

        private String profession;

        private String address;

        private String phone;

        public String getId() {

            return id;

        }

        public void setId(String id) {

            this.id = id;

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public Integer getAge() {

            return age;

        }

        public void setAge(Integer age) {

            this.age = age;

        }

        public String getProfession() {

            return profession;

        }

        public void setProfession(String profession) {

            this.profession = profession;

        }

        public String getAddress() {

            return address;

        }

        public void setAddress(String address) {

            this.address = address;

        }

        public String getPhone() {

            return phone;

        }

        public void setPhone(String phone) {

            this.phone = phone;

        }

        public String toString(){

            StringBuffer sb = new StringBuffer();

            sb.append(id + " ");

            sb.append(name + " ");

            sb.append(age + " ");

            sb.append(profession + " ");

            sb.append(address + " ");

            sb.append(phone + " ");

            return sb.toString();

        }

    }

    标签的解析类如下:

    public class CustomTagBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

        private final Class<?> beanClass;

        private final boolean required;

        public CustomTagBeanDefinitionParser (Class<?> beanClass, boolean required) {

            this.beanClass = beanClass;

            this.required = required;

        }

        protected Class getBeanClass(Element element) {

            return CustomTag.class;

        }

        protected void doParse(Element element, BeanDefinitionBuilder builder) {

            //通过配置文件获取相应的值,设置到bean的属性中

            String id = element.getAttribute("id");

            String name = element.getAttribute("name");

            String age = element.getAttribute("age");

            String profession = element.getAttribute("profession");

            String address = element.getAttribute("address");

            String phone = element.getAttribute("phone");

            if (StringUtils.hasText(id)) {

                builder.addPropertyValue("id", id);

            }

            if (StringUtils.hasText(name)) {

                builder.addPropertyValue("name", name);

            }

            if (StringUtils.hasText(age)) {

                builder.addPropertyValue("age", age);

            }

            if (StringUtils.hasText(profession)) {

                builder.addPropertyValue("profession", profession);

            }

            if (StringUtils.hasText(address)) {

                builder.addPropertyValue("address", address);

            }

            if (StringUtils.hasText(phone)) {

                builder.addPropertyValue("phone", phone);

            }

        }

        

    }

    NameSpaceHandle类如下:

    public class CustomTagNamespaceHandler extends NamespaceHandlerSupport {

        @Override

        public void init() {

            //实现init方法,解析CustomTag标签

            registerBeanDefinitionParser("customTag",new CustomTagBeanDefinitionParser(CustomTag.class,true));

        }

    }

    spring.handlers配置,前面那一串其实可以随便配置,只要一会和后面的配置一致即可

    http://www.51gitee.net/schema/customTag=springNameSpace.CustomTagNamespaceHandler

    spring.schemas配置

    http://www.51gitee.net/schema/customTag/customTag.xsd=META-INF/customTag.xsd

    customTag.xsd的配置

    <?xml version="1.0" encoding="UTF-8"?>

    <xsd:schema

            xmlns="http://www.51gitee.net/schema/customTag"

            xmlns:xsd="http://www.w3.org/2001/XMLSchema"

            xmlns:beans="http://www.springframework.org/schema/beans"

            targetNamespace="http://www.51gitee.net/schema/customTag"

            elementFormDefault="qualified"

            attributeFormDefault="unqualified">

        <xsd:import namespace="http://www.springframework.org/schema/beans" />

        <!-- 定义element名, customTagType对应了bean的属性  -->

        <xsd:element name="customTag" type="customTagType">

            <xsd:annotation>

                <xsd:documentation><![CDATA[ The customTag config ]]></xsd:documentation>

            </xsd:annotation>

        </xsd:element>

        <!--  配置各属性值,有点像Mybatis配置对应的model   -->

        <xsd:complexType name="customTagType">

            <xsd:attribute name="id" type="xsd:ID">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The unique identifier for a bean. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

            <xsd:attribute name="name" type="xsd:string" use="required">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The customTag name. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

            <xsd:attribute name="age" type="xsd:int">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The customTag age. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

            <xsd:attribute name="profession" type="xsd:string">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The customTag profession. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

            <xsd:attribute name="address" type="xsd:string">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The customTag address. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

            <xsd:attribute name="phone" type="xsd:string">

                <xsd:annotation>

                    <xsd:documentation><![CDATA[ The customTag phone. ]]></xsd:documentation>

                </xsd:annotation>

            </xsd:attribute>

        </xsd:complexType>

    </xsd:schema>

    最后测试

    在新建一个spring的配置文件如下

    <?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:common="http://www.51gitee.net/schema/customTag"

           xsi:schemaLocation="

         http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

         http://www.oschina.net/schema/customTag

         http://www.oschina.net/schema/customTag/customTag.xsd">

        <common:customTag id="test"  name="chewenliang" address="bei jing" age="12" phone="18618152379" profession="技术" />

    </beans>

    在java代码中测试

    public class TestNameSpace {

        public static void main(String[] args) {

            ApplicationContext context = new ClassPathXmlApplicationContext("spring-test.xml");

            CustomTag customTag= (CustomTag) context.getBean("test");

            System.out.println(customTag.toString());

        }

    }

    输出结果:

        test  

        chewenliang  

        12  

        技术  

        bei jing  

        18618152379  

    spring的自定义标签自己很容易实现,具体要看在实际项目中如何正确的实用它,接下来会记录dubbo是如何解析、暴露服务。

    关注我可以获取it视频

  • 相关阅读:
    常用基础命令
    Vim
    Linux目录结构
    稀疏数组
    数据结构概述
    天天用的命令
    Mysql和redis的安装
    回文排列
    URL化
    在word中做复选框打对勾钩
  • 原文地址:https://www.cnblogs.com/happyhuangjinjin/p/8762824.html
Copyright © 2011-2022 走看看