@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主要做配置信息初始化,上图最后一步是创建远程服务代理对象,后面的流程很长,以后的文章做介绍。创建出远程服务代理对象后,将代理对象设置到@Reference注解的属性上,这样使用属性对象调用远程服务时,其实就是调用这个代理对象。
上图第一步创建的远程服务名作用是,dubbo根据该名字判断spring容器是否已经有@Reference需要的服务对象,如果有将第二步创建的referenceBean名字在spring容器中注册为别名。如果spring容器中找到了服务对象,说明服务在本地已经发布,客户端使用服务时,可以直接调用本地。