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拓展技术的更多相关文章

  1. 6.2 dubbo在spring中自定义xml标签源码解析

    在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...

  2. 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 ...

  3. spring集成常用技术的配置

    使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...

  4. Dubbo在Spring和Spring Boot中的使用

    一.在Spring中使用Dubbo 1.Maven依赖 <dependency> <groupId>com.alibaba</groupId> <artifa ...

  5. 集成Dubbo服务(Spring)

    Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...

  6. spring schema自定义

    今天看了一下分布式服务框架的那本书,于是里面提到了spring schema的自定义,于是去简单的了解了一下 参考资源:spring schema扩展: http://www.yihaomen.com ...

  7. Dubbo和Spring Cloud微服务架构'

    微服务架构是互联网很热门的话题,是互联网技术发展的必然结果.它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.虽然微服务架构没有公认的技术标准和规范或者草案,但业 ...

  8. Dubbo和Spring Cloud微服务架构比较

    Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司:只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主. 微服 ...

  9. 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  10. Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

随机推荐

  1. Android复习(三)清单文件中的元素——> provider、receiver、service

    <provider> 语法:   <provider android:authorities="list" android:directBootAware=[&q ...

  2. 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(3)

    1.问题描述: compatibleSdkVersion升级到5.0.0(12)之后,调用坐标系转换API:map.convertCoordinate(mapCommon.CoordinateType ...

  3. Webpack热加载显示 'Cannot get /' 解决办法

    安装webpack-dev-server后,用 npm 打包运行,打开后显示 'Cannot get /' : 需要在webpack.config.js的devServer中添加以下代码: 现在再次运 ...

  4. Buffer和Channel

    IO 和 NIO 区别: 可简单认为:IO 是面向流的处理,NIO 是面向块(缓冲区)的处理 面向流的 I/O 系统一次一个字节地处理数据. 一个面向块(缓冲区)的 I/O 系统以块的形式处理数据. ...

  5. 构建自己的DEX

    构建自己的DEX 简介:用户可通过主流钱包Dapp浏览器,访问URL地址,进行Swap, BSC链 界面演示 技术栈 Solidity React Typescript Vite Wagmi Open ...

  6. 【2024.9.30】NOIP2024 赛前集训-刷题训练(4)

    [2024.9.30]NOIP2024 赛前集训-刷题训练(4) Problem - 2000D - Codeforces 给一串数和一串LR字符,L 可以向右连接 R, 覆盖部分的LR不能再使用,但 ...

  7. Kriging 模型 —— 克里金法 —— 最优插值

  8. k8s之ExternalName使用

    一.简介 externalName Service是k8s中一个特殊的service类型,它不需要指定selector去选择哪些pods实例提供服务,而是使用DNS CNAME机制把自己CNAME到你 ...

  9. 剖析Air724UG的硬件设计,还有大发现?01部分

    ​ 一.绪论 Air724UG是一款基于紫光展锐UIS8910DM平台设计的LTE Cat 1无线通信模组.支持FDD-LTE/TDD-LTE的4G远距离通讯和Bluetooth近距离无线传输技术,支 ...

  10. Navicat Premium 16下载与安装

    1.可以通过以下两种方式下载 a.官网下载地址 https://www.navicat.com.cn/download/navicat-premium b.百度网盘下载地址 链接:https://pa ...