Dubbo基于自定义配置,实现自己的Bean。

通常,完成一个自定义配置需要以下步骤:

  • 设计配置属性和JavaBean;
  • 编写XSD文件;
  • 编写NamespaceHandler和BeanDefinitionParser完成解析工作;
  • 编写spring.handlers和spring.schemas串联起所有部件;
  • 在Bean文件中应用。

下面是一个小Demo,

(1)设计配置属性和JavaBean

首先当然得设计好配置项,并通过 JavaBean 来建模,本例中需要配置 People 实体,配

置属性 name 和 age(id 是默认需要的)

public class People {
private String id;
private String name;
private Integer age;
}

(2)编写 XSD 文件

为上一步设计好的配置项编写 XSD 文件,XSD 是 schema 的定义文件,配置的输入和解

析输出都是以 XSD 为契约,本例中 XSD 如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
xmlns="http://blog.csdn.net/cutesource/schema/people" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://blog.csdn.net/cutesource/schema/people" elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:element name="people">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="name" type="xsd:string"/>
<xsd:attribute name="age" type="xsd:int"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>

xsd:schema 的各个属性具体含义参考 http://www.w3school.com.cn/schema/schema_schema.asp

<xsd:element name="people">对应着配置项节点的名称,因此在应用中会用 people 作为 节点名来引用这个配置

<xsd:attribute name="name" type="xsd:string" /> 和 <xsd:attribute name="age" type="xsd:int" />对应着配置项people的两个属性名,因此在应用中可以配置name和 age 两个属性,分别是 string 和 int 类型

完成后需把 xsd 存放在 classpath 下,一般都放在 META-INF 目录下(本例就放在这个目录下)。

(3)编写 NamespaceHandler 和 BeanDefinitionParser 完成解析工作

下面需要完成解析工作,会用到 NamespaceHandler 和 BeanDefinitionParser 这两个概念。

具体说来 NamespaceHandler 会根据 schema 和节点名找到某个 BeanDefinitionParser,然后由 BeanDefinitionParser 完成具体的解析工作。因此需要分别完成 NamespaceHandler 和 BeanDefinitionParser 的实现类,Spring 供了默认实现类 NamespaceHandlerSupport 和 AbstractSingleBeanDefinitionParser,简单的方式就是去继承这两个类。本例就是采取这种方式:

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class MyNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());
}
}

其中 registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());就是用来 把节点名和解析类联系起来,在配置中引用 people 配置项时,就会用

PeopleBeanDefinitionParser 来解析配置。PeopleBeanDefinitionParser 就是本例中的解析类:

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
public class PeopleBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
protected Class getBeanClass(Element element) {
return People.class;
} protected void doParse(Element element, BeanDefinitionBuilder bean) {
String name = element.getAttribute("name");
String age = element.getAttribute("age");
String id = element.getAttribute("id");
if (StringUtils.hasText(id)) {
bean.addPropertyValue("id", id);
}
if (StringUtils.hasText(name)) {
bean.addPropertyValue("name", name);
}
if (StringUtils.hasText(age)) {
bean.addPropertyValue("age", Integer.valueOf(age));
}
}
}

(4)编写 spring.handlers 和 spring.schemas 串联起所有部件

上面几个步骤走下来会发现开发好的 handler 与 xsd 还没法让应用感知到,就这样放上去是没法把前面做的工作纳入体系中的,spring 供了 spring.handlers 和 spring.schemas 这 两个配置文件来完成这项工作,这两个文件需要我们自己编写并放入 META-INF 文件夹中, 这两个文件的地址必须是 META-INF/spring.handlers 和 META-INF/spring.schemas,spring 会默 认去载入它们。

本例中 spring.handlers 如下所示:

http://blog.csdn.net/cutesource/schema/people=study.schemaExt.MyNamespaceHandler

以上表示当使用到名为"http://blog.csdn.net/cutesource/schema/people"的 schema 引用时, 会通过 study.schemaExt.MyNamespaceHandler 来完成解析

spring.schemas 如下所示:

http://blog.csdn.net/cutesource/schema/people.xsd=META-INF/people.xsd

以上就是载入 xsd 文件。

(5)在 Bean 文件中应用

到此为止一个简单的自定义配置以完成,可以在具体应用中使用了。使用方法很简单, 和配置一个普通的 spring bean 类似,只不过需要基于我们自定义 schema,本例中引用方式

如下所示:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cutesource="http://blog.csdn.net/cutesource/schema/people" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.x sd
http://blog.csdn.net/cutesource/schema/people http://blog.csdn.net/cutesource/schema/people.xsd">
<cutesource:people id="cutesource" name="袁志俊" age="27"/>
</beans>

其中 xmlns:cutesource="http://blog.csdn.net/cutesource/schema/people"是用来指定自定义 schema , xsi:schemaLocation 用 来 指 定 xsd 文 件 。 <cutesource:people id="cutesource" name="zhijun.yuanzj" age="27"/>是一个具体的自定义配置使用实例。

最后就可以在具体程序中使用基本的 bean 载入方式来载入我们的自定义配置对象了, 如:

ApplicationContext ctx = new ClassPathXmlApplicationContext("application.xml"); People p = (People)ctx.getBean("cutesource");
System.out.println(p.getId());
System.out.println(p.getName());
System.out.println(p.getAge());

会输出:

cutesource

袁志俊

27

以上就是一个基于 Spring 可扩展 Schema 供自定义配置支持实战过程,一些复杂应用 和技巧还有待挖掘。

Dubbo学习摘录(一)的更多相关文章

  1. Dubbo学习摘录(二)

    扩展点机制 扩展点的配置 (1)根据关键字读取配置,获取具体的实现类 比如在 dubbo-demo-provider.xml 文件中配置: 则会根据rmi去读取具体的协议实现类RmiProtocol. ...

  2. Dubbo学习摘录(零)

    节点角色说明: Provider:暴露服务的服务提供方: Consumer:调用远程服务的服务消费方: Registry:服务注册与发现的注册中心: Monitor: 统计服务的调用次数和调用时间: ...

  3. Dubbo学习小记

    前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...

  4. dubbo学习(zz)

    dubbo学习 博客分类: 开源软件   Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站 ...

  5. Dubbo学习(六) dubbo 架构图 以及调用过程

    一.Dubbo结构图   duubo结构图 我们解释以下这个架构图:Consumer服务消费者,Provider服务提供者.Container服务容器.消费当然是invoke提供者了,invoke这条 ...

  6. Dubbo学习(一) Dubbo原理浅析

    一.初入Dubbo Dubbo学习文档: http://dubbo.incubator.apache.org/books/dubbo-user-book/ http://dubbo.incubator ...

  7. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

  8. Dubbo学习系列之十三(Mycat数据库代理)

    软件界有只猫,不用我说,各位看官肯定知道是哪只,那就是大名鼎鼎的Tomcat,现在又来了一只猫,据说是位东方萌妹子,暂且认作Tom猫的表妹,本来叫OpencloudDB,后又改名为Mycat,或许Ca ...

  9. Dubbo学习系列之八(分布式事务之MQ方案)

    自从小王玩起了微服务,发现微服务果然很强大,好处真是太多,心中暗喜,然而,却也遇到了分布式中最棘手的问题:分布式事务.小王遍访各路神仙,也无个完美开源解决方案,当然,也有些实际可行的手法,虽不算完美, ...

随机推荐

  1. GoCN每日新闻(2019-10-21)

    GoCN每日新闻(2019-10-21) GoCN每日新闻(2019-10-21)   1. 使用 Golang, RabbitMQ 和 Protobuf 构建高效的微服务 https://mediu ...

  2. GoCN每日新闻(2019-10-19)

    GoCN每日新闻(2019-10-19) Go 1.13中的错误处理 https://tonybai.com/2019/10/18/errors-handling-in-go-1-13 golang核 ...

  3. 第12组 Alpha冲刺(6/6)

    Header 队名:To Be Done 组长博客 作业博客 团队项目进行情况 燃尽图(组内共享) 展示Git当日代码/文档签入记录(组内共享) 注: 由于GitHub的免费范围内对多人开发存在较多限 ...

  4. [SNOI2019]纸牌

    传送门 Description 有一副纸牌.牌一共有\(n\)种,分别标有 \(1,2,...,n\),每种有\(C\)张.故这副牌共有\(nC\)张. 三张连号的牌(\(i,i+1,i+2\))或三 ...

  5. spring boot 防止重复提交

    服务器端实现方案:同一客户端在2秒内对同一URL的提交视为重复提交 上代码吧 pom.xml <?xml version="1.0" encoding="UTF-8 ...

  6. 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web5]CyberPunk 一.知识点 1.伪协议文件读取 2.报错注入 刷题记录:[CISCN2019 华北赛区 Day1 Web5]Cy ...

  7. svg入门详解

    一.svg是什么? SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 是使用 XML 来描述二维图形和绘图程序的语言. SVG 图像在放大或改变尺寸的情况下其图 ...

  8. 第09组 Beta冲刺(4/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...

  9. 为什么printf()用%f输出double型,而scanf却用%lf呢?

    转:https://blog.csdn.net/bat67/article/details/52056057 示例:double x:scanf(“%f”,&x):输入“123.4”,输出x的 ...

  10. 视频色彩空间RGB、YUV、YCbCr

    RGB.YUV和YCbCr都是人为规定的彩色模型或颜色空间(有时也叫彩色系统或彩色空间).它的用途是在某些标准下用通常可接受的方式对彩色加以描述.本质上,彩色模型是坐标系统和子空间的阐述. RGB R ...