`
huangjinjin520
  • 浏览: 71497 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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 + "\n");
        sb.append(name + "\n");
        sb.append(age + "\n");
        sb.append(profession + "\n");
        sb.append(address + "\n");
        sb.append(phone + "\n");
        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视频



  • 大小: 39.9 KB
分享到:
评论

相关推荐

    Dubbo源码解读

    Dubbo是一个高性能的Java RPC框架,它提供了一种方便的分布式服务框架来完成远程调用,这些服务...通过阅读和理解Dubbo源码,开发者不仅能学习到如何实现一个复杂的分布式RPC框架,还能对Spring框架有更加深入的理解。

    dubbo-master.zip

    【标签】中的"dubbo"和"dubbo-master"表明这是一个关于Dubbo核心源码的压缩包,包含了项目的主干部分。 【压缩包子文件的文件名称列表】仅有一个:"dubbo-master",这表示压缩包解压后将直接进入Dubbo项目的根目录...

    dubbo-3.1.4源码包

    这个源码包包含了dubbo的核心组件和服务治理的所有实现,允许开发者深入理解其内部机制,进行二次开发或优化。 【描述】"dubbo-3.1.4源码包"提供了dubbo框架的最新版本,3.1.4版本修复了之前版本的一些问题,并可能...

    dubbo源码解读与实战.doc

    #### 二、Dubbo源码核心模块 **2.1 模块概述** - **dubbo-common**:包含核心接口和工具类。 - **dubbo-rpc**:RPC框架的核心实现,如Protocol、Invoker、Exporter等。 - **dubbo-registry**:注册中心的实现,...

    apache dubbo 3.0.7源码

    Apache Dubbo 3.0.7 是一个高性能、轻量级的开源Java RPC框架,它由阿里集团贡献并维护,现已成为Apache顶级项目。Dubbo的主要目标是提供一种...同时,掌握Dubbo源码也有助于与社区保持同步,及时了解和应用最新特性。

    深入理解Spring与Dubbo整合原理与源码分析:从启动类配置到注解解析.rar

    本文将基于书中的主题,结合标签“spring”、“dubbo”和“软件/插件”,深入解析Spring与Dubbo集成的关键技术和核心概念。 Spring是一个强大的Java企业级应用开发框架,它提供了依赖注入(Dependency Injection, ...

    Dubbo源码(注释版)

    此压缩包提供的" Dubbo源码(注释版)"是针对Dubbo 2.7.3版本的源代码,包含了详细的注释,方便开发者深入理解其内部机制。 一、服务注册与发现 Dubbo的核心功能之一是服务注册与发现。服务提供者在启动时会将自身...

    dubbo2.9.0源码jar包及编译jar包

    Dubbo是阿里巴巴开源的一款高性能、轻量级...总的来说, Dubbo 2.9.0的源码和编译jar包为开发者提供了丰富的学习资源和强大的工具,无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的技能和解决问题的能力。

    - 采用SpringBoot、MyBatis、dubbo框架,RESTFUL接口,自定义的功能级权限系统,极低门槛,拿来即用

    最后,项目提供的源码已经过严格测试,可以直接运行,这对于开发者来说是一个巨大的优势,因为他们可以快速理解和学习项目的实现方式,同时也可以直接用于自己的项目中,降低了二次开发的复杂性和风险。 综上所述,...

    深度解析Dubbo的可扩展机制SPI源码:从理论到实践,打造高效、稳定的分布式服务框架

    Dubbo的可扩展机制SPI(Service Provider Interface)是其核心特性之一,允许开发者根据需要动态扩展服务。...如果你希望进一步研究,可以参考提供的Dubbo源码项目地址:https://gitee.com/archguide/dubbovip.git。

    dubbo2.8.4源代码

    在深入理解Dubbo的源码之前,我们需要对Java、Spring、网络通信等相关知识有一定基础。 【描述】"git下载,调整pom文件,通过mvn install -Dmaven.test.skip=true打包" 这段描述揭示了获取和构建Dubbo源代码的过程...

    dubbo源码解析

    《Dubbo源码解析》是一本深度探讨Dubbo框架核心机制的著作,旨在帮助开发者深入理解这个高性能、轻量级的Java服务治理框架。Dubbo是阿里巴巴开源的分布式服务框架,它提供了服务注册、服务发现、负载均衡、容错、...

    dubbo-2.5.4官网源码下载

    在下载dubbo-2.5.4版本的源码后,我们可以深入学习和理解以下关键概念和技术: 1. **服务提供者与消费者模型**: - 在Dubbo架构中,服务提供者(Provider)是暴露服务的一方,而服务消费者(Consumer)是调用服务...

    incubator-dubbo-ops-master.zip

    《Apache Dubbo 运维平台源码解析》 ...通过深入学习`incubator-dubbo-ops-master`的源码,不仅可以了解Dubbo运维平台的工作原理,还能提升对分布式服务治理的理解,为构建和维护大规模分布式系统提供有力支持。

    xxpay-master,XXPAY公司推出Java JAVA、Apple Spring云、DubBo、Spring BooGuy等。.zip

    6. **开源精神**: 作为一个开源项目,xxpay-master遵循了开放源码的原则,允许社区成员参与开发,提出改进意见,共享和学习代码,这有助于促进技术的交流和进步,同时也增加了项目的可见度和可靠性。 7. **支付服务...

    Dubbo入门到精通架构高级课程(视频+课件+源码)共10套.rar

    8. **源码分析**:深入Dubbo源码,理解其设计思想和实现细节,提升对框架的掌握程度。 9. **最佳实践与问题排查**:分享Dubbo在实际项目中的最佳实践,以及常见问题的排查和解决方案。 10. **未来趋势**:讨论...

    dubbo后台管理、监控 源码

    通过源码学习,我们可以了解到: 1. 如何集成注册中心,实现服务的动态注册和发现。 2. 如何设计和实现RESTful API,实现Web与后台服务的通信。 3. 如何利用Spring框架构建MVC结构,实现Web界面与后端逻辑的解耦。 ...

    SpringBoot+Dubbo+Mybatis亲测

    综上所述,这个项目展示了如何在Spring Boot环境中集成Dubbo和Mybatis,利用Zookeeper实现服务发现和治理,同时通过自定义Endpoint提供内部服务监控。这为开发者提供了一个实战平台,学习如何构建微服务架构和理解各...

    alibaba-dubbo-dubbo-2.5.7-0-ge2d63ad.tar.gz

    此外,还可以学习到Dubbo如何与其他组件如Zookeeper、Spring等进行集成,以及如何扩展和定制Dubbo以满足特定需求。 此外,Dubbo 2.5.7版本相较于早期版本,可能引入了新的特性或优化。例如,可能对性能进行了提升,...

Global site tag (gtag.js) - Google Analytics