當某個主要註冊到spring容器中的bean 的屬性上有@Reference註解時,並且 註解的injvm = false時(默認),表明該屬性會被註入壹個遠程接口實例,用作rpc遠程調用。
@Reference不是派生自spring默認支持的@Resource和@Autowired,那麽說明spring是不支持該註解用於依賴註入的,dubbo對此進行了支持該註冊的拓展。
在入口@EnableDubbo配置了掃描的包路徑
用於掃描類上含有dubbo@Service 和類屬性上含有 @Reference 的bean
@DubboComponentScan 導入了DubboComponentScanRegistrar
DubboComponentScanRegistrar實現Spring的ImportBeanDefinitionRegistrar接口,被調用到實現的registerBeanDefinitions()時,會註冊兩個beanPostProcessor類
ReferenceAnnotationBeanPostProcessor實現了和spring中支持@Autowired註冊的AutowiredAnnotationBeanPostProcessor壹模壹樣的接口 :MergedBeanDefinitionPostProcessor,繼承了InstantiationAwareBeanPostProcessorAdapter。兩者的工作邏輯幾乎壹模壹樣。
在bean實例化之後,對 bean進行依賴註入
postProcessPropertyValues()
這個方法每個bean實例化都會調到,ReferenceAnnotationBeanPostProcessor用的是父類AnnotationInjectedBeanPostProcessor的
判斷方法和類上是否有@Reference註解,並將其包包裝成AnnotationInjectedBeanPostProcessor.AnnotatedInjectionMetadata 對象,進行緩存
判斷屬性是否可以獲取到@Reference,獲取到返回
收集到需要依賴註入的屬性之後,下壹步獲取到被依賴的bean實例,進行反射賦值
調用內部類AnnotatedFieldElement中的inject方法
獲取到dubbo創建的代理實例,反射設置有@Reference的屬性上