dubbo解析-客户端启动入口

@DubboComponentScan引入了类DubboComponentScanRegistrar,DubboComponentScanRegistrar通过代码将ReferenceAnnotationBeanPostProcessor后处理器注册到spring容器中。ReferenceAnnotationBeanPostProcessor是dubbo处理@Reference的核心,继承了AbstractAnnotationBeanPostProcessor。

AbstractAnnotationBeanPostProcessor用于处理自定义注解。如果自定义注解注解了属性或者方法,而且需要创建对象并设置到属性或者方法入参,可以继承AbstractAnnotationBeanPostProcessor,并实现doGetInjectedBean方法。doGetInjectedBean方法可以创建需要注入的对象。

dubbo创建ReferenceAnnotationBeanPostProcessor时,指定了自定义的注解为@Reference。ReferenceAnnotationBeanPostProcessor扫描类,将含有Reference注解的类需要的对象创建出来,并赋值给对应的属性。

public ReferenceAnnotationBeanPostProcessor() {
        super(Reference.class, com.alibaba.dubbo.config.annotation.Reference.class);
    }

按照spring的启动流程需要执行ReferenceAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法和postProcessPropertyValues方法。其流程如下:


执行流程

下面重点介绍一下doGetInjectedBean的流程:


doGetInjectedBean流程

doGetInjectedBean主要做配置信息初始化,上图最后一步是创建远程服务代理对象,后面的流程很长,以后的文章做介绍。创建出远程服务代理对象后,将代理对象设置到@Reference注解的属性上,这样使用属性对象调用远程服务时,其实就是调用这个代理对象。
上图第一步创建的远程服务名作用是,dubbo根据该名字判断spring容器是否已经有@Reference需要的服务对象,如果有将第二步创建的referenceBean名字在spring容器中注册为别名。如果spring容器中找到了服务对象,说明服务在本地已经发布,客户端使用服务时,可以直接调用本地。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容