基於 dubbo.jar 內的 META-INF/spring.handlers
配置,Spring 在遇到 dubbo 名稱空間時,會回調 DubboNamespaceHandler
。spring
全部 dubbo 的標籤,都統一用 DubboBeanDefinitionParser
進行解析,基於一對一屬性映射,將 XML 標籤解析爲 Bean 對象。spa
在 ServiceConfig.export()
或 ReferenceConfig.get()
初始化時,將 Bean 對象轉換 URL 格式,全部 Bean 屬性轉成 URL 的參數。code
而後將 URL 傳給協議擴展點,基於擴展點的擴展點自適應機制(Dubbo SPI),根據 URL 的協議頭,進行不一樣協議的服務暴露或引用。xml
spring 掃描全部 jar 下 META-INF/spring.handlers
和 META-INF/spring.schemas
對象
運行dubbo.jar/META-INF/spring.handlers
下定義的DubboNamespaceHandler
的 init() 方法事件
spring 加載 xml,執行 DubboBeanDefinitionParser
的 parse() 方法,經過RootBeanDefinition將serviceBean 暴露給 spring。(實際調用AutowireCapableBeanFactory.registerBeanDefinition)get
ServiceBean 實現了 ApplicationListener<ContextRefreshedEvent>
,Spring 容器 refresh() 以後,發送 Event 事件,而後 ServiceBean 作服務暴露操做。(服務暴露)it
ReferenceBean 實現了 InitializingBean,在 Bean 實例化過程當中會調用 afterPropertiesSet(),而後 ReferenceBean 作服務引用操做。(服務引用)io
其中比較重要的是 ServiceBean 和 ReferenceBean。class