@DubboComponentScan引入了類DubboComponentScanRegistrar,DubboComponentScanRegistrar通過代碼將ReferenceAnnotationBeanPostProcessor后處理器注冊到spring容器中季俩。ReferenceAnnotationBeanPostProcessor是dubbo處理@Reference的核心闪盔,繼承了AbstractAnnotationBeanPostProcessor违寞。
AbstractAnnotationBeanPostProcessor用于處理自定義注解。如果自定義注解注解了屬性或者方法契邀,而且需要?jiǎng)?chuàng)建對象并設(shè)置到屬性或者方法入?yún)诩模梢岳^承AbstractAnnotationBeanPostProcessor,并實(shí)現(xiàn)doGetInjectedBean方法坯门。doGetInjectedBean方法可以創(chuàng)建需要注入的對象微饥。
dubbo創(chuàng)建ReferenceAnnotationBeanPostProcessor時(shí),指定了自定義的注解為@Reference古戴。ReferenceAnnotationBeanPostProcessor掃描類欠橘,將含有Reference注解的類需要的對象創(chuàng)建出來,并賦值給對應(yīng)的屬性允瞧。
public ReferenceAnnotationBeanPostProcessor() {
super(Reference.class, com.alibaba.dubbo.config.annotation.Reference.class);
}
按照spring的啟動流程需要執(zhí)行ReferenceAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法和postProcessPropertyValues方法简软。其流程如下:
下面重點(diǎn)介紹一下doGetInjectedBean的流程:
doGetInjectedBean主要做配置信息初始化,上圖最后一步是創(chuàng)建遠(yuǎn)程服務(wù)代理對象述暂,后面的流程很長痹升,以后的文章做介紹。創(chuàng)建出遠(yuǎn)程服務(wù)代理對象后畦韭,將代理對象設(shè)置到@Reference注解的屬性上疼蛾,這樣使用屬性對象調(diào)用遠(yuǎn)程服務(wù)時(shí),其實(shí)就是調(diào)用這個(gè)代理對象艺配。
上圖第一步創(chuàng)建的遠(yuǎn)程服務(wù)名作用是察郁,dubbo根據(jù)該名字判斷spring容器是否已經(jīng)有@Reference需要的服務(wù)對象衍慎,如果有將第二步創(chuàng)建的referenceBean名字在spring容器中注冊為別名。如果spring容器中找到了服務(wù)對象皮钠,說明服務(wù)在本地已經(jīng)發(fā)布稳捆,客戶端使用服務(wù)時(shí),可以直接調(diào)用本地麦轰。