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源码深度解析》

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容