最近在研究dubbo源码,有一点之前没怎么细看,就是Spring怎么整合Dubbo的,还有就是Dubbo是怎么拓展Spring的。正好也好久没更新博客了,水一波博客。
dubbo版本:2.5.3
spring版本:4.3.6.RELEASE
ps:最近回头看以前的博客,感觉代码过多,不大好,以后尝试使用多用文字的形式,少贴代码
本篇研究的问题
- Spring是怎么整合Dubbo
- Dubbo是怎么拓展Spring的
Spring是怎么整合第三方框架的
大体的解析顺序如上所示。最终调用com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler#init
这个方法,至于Dubbo怎么处理呢,就到下面讲解了。
这里我就讲解下Spring处理META-INF/spring.handlers的
核心呢就是org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver#getHandlerMappings
他会扫描类加载器下所有的META-INF/spring.handlers。但是有一点很坑,idea会自动触发toString方法,而toString方法会调用这个方法,很坑,没法调试。
总之,结果就如截图所示。反正分析了也没人看,就不分析了,贴截图,你们打个断点就知道了。
Dubbo是怎么拓展Spring的
下面开始分析DubboNamespaceHandler#init
这几个魔法字符串是不是很熟悉,就是对应了那几个标签,简单的来说就是告诉spring怎么解析这几个标签。DubboBeanDefinitionParser
呢就不分析了,他里面的parse方法,就是解析那几个标签里面的属性,所有标签共用(eg. reference,method),方法内部没有一个很好的处理,纯靠ifelse来处理(你没看错),核心就是将标签解析成BeanDefinition
。
之后Dubbo定义的BeanFactoryPostProcessor
(我这里是SpringZookeeperRegistryCenter
)会将对应的标签通过反射创建,存储到缓存中,这里仅创建,其他什么都没做。
最后在依赖注入的时候调用ReferenceBean#getObject
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。