dubbo(一)spring schema拓展技术
https://blog.csdn.net/java_zldz_xuws/article/details/84648398
在阐述dubbo原理之前,我先介绍一下dubbo与spring怎么糅合在一块,为什么dubbo标签,spring可以解析以及dubbo spi是什么,这是学习dubbo的第一步,接下来,我们会从源码的角度,进一步解析dubbo如何实现服务暴露,注册,路由,负载均衡,线程模型,mock机制,超时重试,服务发现,启动检查,令牌,优雅关机,协议,序列化,编解码,缓存,泛化,事件 等,欢迎大家指正和学习
Spring提供了可扩展Schema的支持,完成一个自定义配置一般需要以下步骤:
设计配置属性和JavaBean
编写XSD文件
编写NamespaceHandler和BeanDefinitionParser完成解析工作
编写spring.handlers和spring.schemas串联起所有部件
在Bean文件中应用
dubbo中所有dubbo的标签,都统一用DubboBeanDefinitionParser进行解析,基于一对一属性映射,将XML标签解析为Bean对象。
下面我们就用dubbo为例来看如何实现对Spring配置的标签扩展。(对应的项目我已经上传至github,地址:https://github.com/xuws2gj/spring-schema.git)
1)设计配置属性和JavaBean
2)编写XSD文件
在这里需要注意的是把spring.schemas(http\://www.pomelo.com/schema/people.xsd=META-INF/people.xsd)
xmlns与targetNamespace写上http\://www.pomelo.com/schema/people
3)编写spring.schemas与spring.handlers文件
spring.schemas使用http\://www.pomelo.com/schema/people.xsd帮我们找到对应的xsd项目位置META-INF/people.xsd
spring.handlers定义 http\://www.pomelo.com/schema/people=com.dean.handle.NamespaceHandler,在加载xsd的时候遇到namespace定义加载进入解析标签
4)编写NamespaceHandler
spring加载applicationContext.xml启动过程中,spring解析标签变成bean过程,我们这里不讨论,感兴趣的话
https://blog.csdn.net/fighterandknight/article/details/50126329/,http://www.blogjava.net/heavensay/archive/2013/10/28/405699.html
loadBeanDefinitions
-doLoadBeanDefinitions-registerBeanDefinitions(doc(xml解析成Document对象), resource)
-registerBeanDefinitions(Document doc, Resource resource)
-registerBeanDefinitions(Document doc, XmlReaderContext readerContext)
-parseBeanDefinitions(root, delegate)--这个方法区别了默认标签和自定义标签解析规则
-parseCustomElement(Element ele)
-parseCustomElement(Element ele, BeanDefinition containingBd)-根据元素的命名空间(applicationContext.xml-xmlns:people)经过resolve(namespaceUri) 方法会找META-INF/spring.handlers得到NamespaceHandler
-handler.parse(ele, new ParserContext(this.readerContext, this, containingBd))会找具体实现类(namespaceHandler的parse实现即使用studtentBeanDefinitionParser进行自定义标签解析)
5)编写ApplicationContext.xml
这里需要注意的是xmlns:people定义了namespace---handler
6)编写StudentBeanDefinitionParser
关于spring如何添加新定义的标签和解析标签涉及到 BeanDefinitionParserDelegate,感兴趣的可以-------------------------------------http://blog.51cto.com/dba10g/1726519,https://blog.csdn.net/fighterandknight/article/details/50126329,AbstractBeanDefinitionParser的parse()方法看一下, 可以看到,该处理逻辑中主要是获取当前标签中定义的name和age属性的值,然后将其按照一定的处理逻辑注册到当前的BeanDefinition中。这里还实现了一个getBeanClass()方法,该方法用于表明当前自定义标签对应的BeanDefinition所代表的类的类型
对自定义配置文件的解析,但是我们可以看到,在这个函数中大部分的来处理将解析后的AbstractBeanDefinition转换为BeanDefinitionHolder并注册的功能,而真正去做解析的事情委托了给parseInternal,真是这句代码调用了我们的自定义解析函数doParse()。在parseInternal中,并不是直接调用自定义的doParse函数,而是惊醒了一些列的数据准备,包括对beanClass,scope,lazyInit等
7)编写SchemaTest
总结 dubbo自定义标签使用了spring-schema,dubbo配置标签与spring完成融合 dubbo源码dubbo-config下的dubbo-spring有对应的实现过程,原理类似,即定义属性,xsd,handler,dubboBeanDefinitionParser等完成
dubbo(一)spring schema拓展技术的更多相关文章
- 6.2 dubbo在spring中自定义xml标签源码解析
在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...
- Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://dubbo.apache.org/schema/dubbo]
dubbo的官方文档写的真好, http://dubbo.apache.org/zh-cn/docs/2.7/user/dependencies/ 在使用dubbo过程中的问题, 和解决 org.sp ...
- spring集成常用技术的配置
使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...
- Dubbo在Spring和Spring Boot中的使用
一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifa ...
- 集成Dubbo服务(Spring)
Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...
- spring schema自定义
今天看了一下分布式服务框架的那本书,于是里面提到了spring schema的自定义,于是去简单的了解了一下 参考资源:spring schema扩展: http://www.yihaomen.com ...
- Dubbo和Spring Cloud微服务架构'
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...
- Dubbo和Spring Cloud微服务架构比较
Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
- Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
随机推荐
- PRT预计算辐射传输方法
PRT(Precomputed Radiance Transfer)技术是一种用于实时渲染全局光照的方法.它通过预计算光照传输来节省时间,并能够实时重现面积光源下3D模型的全局光照效果. 由于PRT方 ...
- 如何让img图片居中
说明:img是行内块元素,用一个盒子(父元素)嵌套img(子元素) text-align:center;可以让父元素为块元素的行内块或行内元素水平居中: vaertical-align:middle; ...
- NVM使用说明
下载:https://github.com/coreybutler/nvm-windows/releases 切换镜像源: settting.txt文件后面添加 node_mirror: https ...
- 什么是 h5项目
首先 h5项目不是 html5 的意思,在者 h5 不是微信网页 : h5 是移动网页的统称 :
- slot原理
vue提供组件插槽能力, 允许开发者在封装组件时,把不确定的部分定义为插槽 : 作用:再不确定的内容位置占位,在子组件内使用 slot 标签写占位的内容 : 插槽的分类 : 默认插槽: 具名插槽:使用 ...
- 010 Python 重中之重的变量
#!/usr/bin/env python # -*- coding:utf-8 -*- # Datatime:2022/7/16 20:32 # Filename:010 Python 重中之重的变 ...
- python将html批量转换为md
一.安装依赖 pip install html2text 代码实现 import os import shutil import html2text def convert_html2md(src_h ...
- Runtime类的简单应用
1.描述 Runtime:描述运行时状态. 在整个JVM中,Runtime类是唯一一个与JVM运行状态有关的类,且默认提供一个该类的实例化对象. 由于在每一个JVM进程中只允许提供一个Runtime类 ...
- ASN.1 DER证书私钥的提取
Java生成的证书在.Net里面无法导入.原因是Java导入的整个ASN.1格式的证书..Net需要设置的只是证书的密钥(公钥.私钥).无法直接使用,因此需要提取密钥. 1.查看密钥 使用lapo.i ...
- python面向对象复习
1.类的语法 # 类的语法 # 定义类 class Dog(object): # 类的属性或者类变量,一般是公共属性,存在类的内存空间,所有实例对象共享 d_type = "京巴" ...