Dubbo源码解析:服务暴露与发现中的Spring自定义Schema
笔记哥 /
04-13 /
31点赞 /
0评论 /
330阅读
一、概述
dubbo是一个简单易用的RPC框架,通过简单的提供者,消费者配置就能完成无感的网络调用。那么在dubbo中是如何将提供者的服务暴露出去,消费者又是如何获取到提供者相关信息的呢?
二、dubbo与spring的整合
在了解dubbo的服务注册和服务发现之前,我们首先需要掌握一个知识点:Spring中自定义Schema
三、Spring自定义Schema
Dubbo 现在的设计是完全无侵入,也就是使用者只依赖于配置契约。在 Dubbo 中,可以使用 XML 配置相关信息,也可以用来引入服务或者导出服务。
配置完成,启动工程,Spring 会读取配置文件,生成注入相关Bean。那 Dubbo 如何实现自定义 XML 被 Spring 加载读取呢 ?
从 Spring 2.0 开始,Spring 开始提供了一种基于 XML Schema 格式扩展机制,用于定义和配置 bean
入门案例
学习和使用Spring XML Schema 扩展机制并不难,需要下面几个步骤:
1、创建配置属性的JavaBean对象
2、创建Spring.xml文件
3、编写Spring.handlers文件配置所有部件
4、自定义处理器类,并实现NamespaceHandler接口
5、自定义解析器,实现BeanDefinitionParser接口(最关键的部分)
6、编写Spring.schemas文件配置所有部件
7、创建一个 XML Schema 文件,描述自定义的合法构建模块,也就是xsd文件
1、定义JavaBean对象,在spring中此对象会根据配置自动创建
```csharp
public class User {
private String id;
private String name;
private Integer age;
//省略getter setter方法
}
```
2、定义spring.xml配置文件,并导入对应约束
```csharp
```
3、编写Spring.handlers文件配置所有部件
定义spring.handlers文件,根据Spring.xml的xsi:schemaLocation="http://www.itheima.com/schema/user" 与NamespaceHandler类的对应关系;必须放在classpath下的META-INF文件夹中
```csharp
http\://www.itheima.com/schema/user=com.itheima.schema.UserNamespaceHandler
```
4、自定义处理器类,并实现NamespaceHandler接口
自定义UserNamespaceHandler类
```csharp
package com.itheima.schema;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class UserNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
}
}
```
5、自定义解析器,实现BeanDefinitionParser接口(最关键的部分)
BeanDefinitionParser是标签对应的解析器,Spring读取到对应标签时会使用该类进行解析;
```csharp
public class UserBeanDefinitionParser extends
AbstractSingleBeanDefinitionParser {
protected Class getBeanClass(Element element) {
return User.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));
}
}
}
```
6、编写Spring.schemas文件配置所有部件
定义spring.schemas文件,根据Spring.xml的xsi:schemaLocation="http://www.itheima.com/schema/user.xsd" 与 user.xsd文件对应关系;必须放在classpath下的META-INF文件夹中。
```csharp
http\://www.itheima.com/schema/user.xsd=META-INF/user.xsd
```
7、创建一个 XML Schema 文件,描述自定义的合法构建模块,也就是xsd文件
在META-INF下定义user.xsd文件,使用xsd用于描述标签的规则
```csharp
```
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/2200
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利