做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视频

dubbo源码学习(二) : spring 自定义标签的更多相关文章

  1. Dubbo源码学习(二)

    @Adaptive注解 在上一篇ExtensionLoader的博客中记录了,有两种扩展点,一种是普通的扩展实现,另一种就是自适应的扩展点,即@Adaptive注解的实现类. @Documented ...

  2. Dubbo源码学习--服务是如何引用的

    ReferenceBean 跟服务引用一样,Dubbo的reference配置会被转成ReferenceBean类,ReferenceBean实现了InitializingBean接口,直接看afte ...

  3. Dubbo源码学习--服务是如何发布的

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 ServiceBean ServiceBean 实现ApplicationListener接口监听Conte ...

  4. Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题

    Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题 相关文章: Dubbo源码学习文章目录 前言 主要是前一阵子换了工作,第一个任务就是解决目前团队在 Dubbo 停机时产生的问题 ...

  5. Dubbo源码学习--注册中心分析

    相关文章: Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 注册中心 关于注册中心,Dubbo提供了多个实现方式,有比较成熟的使用zookeeper 和 redis 的 ...

  6. Dubbo源码学习--集群负载均衡算法的实现

    相关文章: Dubbo源码学习文章目录 前言 Dubbo 的定位是分布式服务框架,为了避免单点压力过大,服务的提供者通常部署多台,如何从服务提供者集群中选取一个进行调用, 就依赖Dubbo的负载均衡策 ...

  7. Dubbo源码学习文章目录

    目录 Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 Dubbo源码学习--注册中心分析 Dubbo源码学习--集群负载均衡算法的实现

  8. dubbo源码学习(二)dubbo容器启动流程简略分析

    dubbo版本2.6.3 继续之前的dubbo源码阅读,从com.alibaba.dubbo.container.Main.main(String[] args)作为入口 简单的数据一下启动的流程 1 ...

  9. 框架源码系列六:Spring源码学习之Spring IOC源码学习

    Spring 源码学习过程: 一.搞明白IOC能做什么,是怎么做的  1. 搞明白IOC能做什么? IOC是用为用户创建.管理实例对象的.用户需要实例对象时只需要向IOC容器获取就行了,不用自己去创建 ...

随机推荐

  1. 转 loadrunner11 录制 chrome 浏览器

    chrome不设置代理的原始状态 图1 [LoadRunner]解决LR11无法录制Chrome浏览器脚本问题   LoadRunner录制脚本时,遇到高版本的IE.FireFox,或者Chrome浏 ...

  2. 如何深入理解Java泛型

    一.泛型的作用与定义 1.1泛型的作用 使用泛型能写出更加灵活通用的代码泛型的设计主要参照了C++的模板,旨在能让人写出更加通用化,更加灵活的代码.模板/泛型代码,就好像做雕塑时的模板,有了模板,需要 ...

  3. python调用tushare获取沪深股通十大成交股

    接口:hsgt_top10 描述:获取沪股通.深股通每日前十大成交详细数据 注:tushare库下载和初始化教程,请查阅我之前的文章 输入参数 名称      |      类型      |    ...

  4. 16-python基础-字典

    1.字典的定义 dictionary(字典)是除列表以外python之中最灵活的数据类型. 字典同样可以存储多个数据. 通常用于存储一个物体的相关信息. 和列表的区别 列表是有序的对象集合 字典是无序 ...

  5. Spring学习笔记(7)——Bean的基本配置

            先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就 ...

  6. myeclipse 报错:Set project compiler compliance settings to '1.5'

    myeclipse 报错:Set project compiler compliance settings to '1.5' 解决方法:项目右击-->properties-->java c ...

  7. 【学术篇】CF833B TheBakery 分治dp+主席树

    题目の传送门~ 题目大意: 将\(n\)个蛋糕分成恰好\(k\)份, 求每份中包含的蛋糕的种类数之和的最大值. 这题有两种做法. 第一种是线段树优化dp, 我还没有考虑. 另一种就是分治+主席树. 然 ...

  8. 同时安装不同版本jdk引起的冲突解决方法

    https://blog.csdn.net/xiongyouqiang/article/details/79240521 现象 由于工作原因, 之前用的jdk1.8版本,因为线上生产环境都是jdk1. ...

  9. wordpress 添加 显示磁盘剩余空间百分比的插件

    在 wp-content/plugins 文件夹下 我取的文件名是: folder-sizes-dashboard-widget.php 在仪表盘 可以看到 Folder Sizes 标题的Box & ...

  10. git暂存区

    在使用git开发时,有三个概念需要知道,工作区,暂存区和版本库.工作区就是直接进行操作的地方,版本库是要将修改提交的地方,那么暂存区是干什么的呢?下面将对暂存区深入研究. 一.修改后能直接提交吗? 在 ...