dubbo启动原理

dubbo是怎么在spring里面解析自定义的标签的

先来了解spring中一个NamespaceHandlerSupport

public abstract class NamespaceHandlerSupport implements NamespaceHandler {
//省略
}

Spring在设计之初就一贯坚持的设计原则:开闭原则:对扩展开放(Open for extension),对修改关闭(Closed for modification)。所以你可以在不修改Spring源代码的情况下扩展Spring的功能。例如新增一个自定义标签

自定义标签的处理流程很简单。

1.获取到命名空间
2.根据命名空间找到对应的命名空间处理器
3.根据用户自定义的处理器进行解析

dubbo中通过DubboNamespaceHandler这个类来解析自定义注解,源码如下

public class DubboNamespaceHandler extends NamespaceHandlerSupport {
    public DubboNamespaceHandler() {
    }
//使用DubboBeanDefinitionParser作为解析类,把解析出来的标签属性值注入到对应的参数类(每个标签执行一次)(ApplicationConfig,ModuleConfig...)中去
    public void init() {
        this.registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true));
        this.registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true));
        this.registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true));
        this.registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true));
        this.registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true));
        this.registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true));
        this.registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true));
        this.registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
        this.registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false));
        this.registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true));
    }

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }
}

以dubbo:referencce标签为例,

public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean 

标签配置的属性,全读出来 ---- set进入ReferenceBean对象,对象实例由IOC容器管理
2.2、ReferenceBean(ServiceBean同理)实现了,initializingBean接口,因此初始化完成时,会调用其afterPropertiesSet方法
在这里插入图片描述
2.3、afterPropertiesSet方法内,进行dubbo服务配置(创建消费端的代理对象/服务端的中转对象/向zk注册信息/订阅信息等)
在这里插入图片描述
这里会对标签中设置的每个协议,进行一行处理(多个协议时集合大于1)
2.4、协议创建中转对象和消费代理
在这里插入图片描述
有几个协议就创建几个中转对象
在这里插入图片描述

2.5、dubbo的初始化结构图:主线是ServiceBean和ReferenceBean的初始化
在这里插入图片描述
其实就是serviceBean和ReferenceBean实现了spring的InitializingBean接口,在初始化后执行按协议创建中转对象和代理对象的一个过程。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值