Dubbo篇:基于XML配置集成Spring源码分析


         目前Dubbo框架提供了3种配置方式:XML配置、注解、属性文件。本文主要介绍schema设计和XML解析。


Spring自定义标签简述


         Dubbo集成Spring主要利用了Spring提供的扩展自定义标签。扩展Spring自定义标签配置大致需要这么几个步骤:
             1.创建一个需要扩展的组件
             2.定义一个XSD文件描述组件内容
             3.创建一个文件实现BeanDefinitionParser接口,用来解析XSD文件中的定会和组件定义。
             4.创建一个Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器。
             5编写Spring.handlers和Spring.schemas文件


         Dubbo配置约束文件在dubbo-config/dubbo-config-spring/src/main/resources/dubbo.xsd中,spring.schemas和spring.handlers文件也在这个目录下。
         spring.schemas文件指明约束文件的具体路径,内容如下:

在这里插入图片描述
         spring.handlers文件指明DubboNamespaceHandler类来解析标签,内容如下:

在这里插入图片描述

         然后在XML配置文件中引入对应的命名空间以及XSD后,就可以直接使用自定义标签了:

在这里插入图片描述



标签解析源码分析


         因为Spring相关不是本文重点,直接进入DefaultBeanDefinitionDocumentReader#parseBeanDefinitions()方法如下:

在这里插入图片描述
         对标签解析时判断命名空间是不是默认的命名空间,不是的话会进入parseCustomElement()执行自定义标签解析逻辑,具体解析逻辑代码如下:

在这里插入图片描述
         此时可以看到获取到的命名空间是dubbo命名空间,根据命名空间获取的对应的NamesHandler是DubboNamespaceHandler,即开篇所说的步骤4,DubboNamespaceHandler代码如下:
在这里插入图片描述

         可以看到DubboNamespaceHandler只是重写了一个init()方法,把不同的标签关联到解析实现类中,即遇到目标标签都会委托给DubboBeanDefinitionParser处理,即开篇所讲步骤3。

         回到parseCustomElement()方法,跟进到DefaultNamespaceHandlerResolver#resolve()方法如下:

在这里插入图片描述

         上面重写的init()方法在此处得以调用。

         再次回到parseCustomElement()方法,此时handler中已经维护了标签所对应的BeanDefinitionParser。

在这里插入图片描述

         继续跟进到parse()方法,进入NamespaceHandlerSupport#parse(),代码实现如下:

在这里插入图片描述

         可以看到会最终选中我们指定的DubboBeanDefinitionParser的parse()方法。即步骤3中我们自实现的BeanDefinitionParser的parse方法在这里调用。

         DubboBeanDefinitionParser的parse()方法实现非常之长,这里就简单描述下,随便贴一下代码:

在这里插入图片描述

         逻辑主是把标签解析成对应的Bean定义并注册到Spring上下文中,依次对各个标签进行解析。将属性注入到Spring的BeanDefinition中,如果属性是引用对象,则Dubbo默认会创建RuntimeBeanReference类型注入,运行时有Spring注入引用对象。

         其实Dubbo只做了属性提取,运行时属性注入和转换都是Spring处理的,即生成的BeanDefinition最终还是会委托Spring创建对应的Java对象。



参考:

《深入理解Apache Dubbo与实战》
《Spring源码深度解析》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值