基于 dubbo.jar 内的 META-INF/spring.handlers
配置,Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler
。
所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser
进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。
在 ServiceConfig.export()
或 ReferenceConfig.get()
初始化时,将 Bean 对象转换 URL 格式,所有 Bean 属性转成 URL 的参数。
然后将 URL 传给协议扩展点,基于扩展点的扩展点自适应机制(Dubbo SPI),根据 URL 的协议头,进行不同协议的服务暴露或引用。
执行过程:
-
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) -
ServiceBean 实现了
ApplicationListener<ContextRefreshedEvent>
,Spring 容器 refresh() 之后,发送 Event 事件,然后 ServiceBean 做服务暴露操作。(服务暴露) -
ReferenceBean 实现了 InitializingBean,在 Bean 实例化过程中会调用 afterPropertiesSet(),然后 ReferenceBean 做服务引用操作。(服务引用)
其中比较重要的是 ServiceBean 和 ReferenceBean。
如果想了解更多Dubbo源码的知识,请移步 Dubbo源码解读——通向高手之路 的视频讲解:
http://edu.51cto.com/sd/2e565