美文网首页
Dubbo篇:基于XML配置集成Spring源码分析

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

作者: 东方明珠脚下的流浪猫 | 来源:发表于2020-07-17 08:37 被阅读0次

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

    相关文章

      网友评论

          本文标题:Dubbo篇:基于XML配置集成Spring源码分析

          本文链接:https://www.haomeiwen.com/subject/fmimhktx.html