1、Dubbo怎么将我们服务注册到spring容器的?
之前一直不喜欢写博客,主要是因为自己文笔不好,现在大家都很卷,我也准备开始写一写博客,卷一下。哪就从最近在看的dubbo源码开始吧。这里是我看代码的一些理解,不代表官方解读哦。如果有写的不好,难以理解的地方,欢迎大家留言。我会改进,希望大家一起越来越好吧。
本次分享的dubbo版本是3.1.1 ,小伙伴们可以在这里拉取代码https://github.com/apache/dubbo
那么我们就从启动dubbo服务开始吧,代码获取到之后,dubbo提供了demo,先看org.apache.dubbo.demo.provider.Application
启动一个dubbo服务,只需要在加上@EnableDubbo注解即可
,是不是很方便。那么我们先来看看EnableDubbo
注解吧
EnableDubbo包含了2个注解@EnableDubboConfig和@DubboComponentScan,本章主要介绍服务如何解析到容器中的,因此我们先来看看DubboComponentScan注解。
这里的@Import
是spring的注解,许多的框架都是通过这种方式向spring容器注册bean的,不了解的小伙伴可以搜索相关内容,后面写完dubbo,我看看也写一些spring的内容,这里就不多说了。重点还是回来看看import里的类。即DubboComponentScanRegistrar
,DubboComponentScanRegistrar
实现了 ImportBeanDefinitionRegistrar
接口。这在spring执行bean工厂的处理器的时候会调用到loadBeanDefinitionsFromRegistrars
方法 ,从而执行到registerBeanDefinitions
方法。
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 初始化dubbo上下文,reference注解处理器,各种监听
DubboSpringInitializer.initialize(registry);
//获取扫描包路径
Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
//注册dubboservice的注解处理器
registerServiceAnnotationPostProcessor(packagesToScan, registry);
}
本章节主要说说服务怎么注册到spring的,那么我们先忽略DubboSpringInitializer.initialize,看看dubboservice注解处理器。registerServiceAnnotationPostProcessor方法其实很简单,就是向容器中注册了ServiceAnnotationPostProcessor
这个bean就完成了。
先来看看这个关系图,我删除了部分本次无关的内容。