本文基于dubbo 2.7.5版本代码
dubbo必须配置注解@EnableDubbo。
一、@EnableDubbo注解功能
@EnableDubbo整合了三个注解@EnableDubboConfig、@DubboComponentScan、@EnableDubboLifecycle。@EnableDubbo的功能都是由这三个注解完成的。
- @EnableDubboConfig引入类DubboConfigConfigurationRegistrar,将用于解析配置相关的类注册到spring容器;
- @DubboComponentScan引入类DubboComponentScanRegistrar,用于指定@Service扫描路径;
- @EnableDubboLifecycle引入类DubboLifecycleComponentRegistrar,注册了两个监听器到spring容器。
一般我们需要配置@DubboComponentScan,定义@Service的扫描路径。如果不配置@DubboComponentScan,默认使用@EnableDubbo注解的类的包路径。
二、详细介绍注解引入的三个类的作用
上面三个引入类都实现了类ImportBeanDefinitionRegistrar。dubbo实现了方法registerBeanDefinitions。该方法的入参有两个:AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry。其中importingClassMetadata表示的是@EnableDubbo注解的类的元信息,可以通过元信息获取每个注解属性值;registry包含了spring容器中所有的bean定义信息。我们可以通过类似下面的代码获取每个注解属性值:
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(DubboComponentScan.class.getName()));
String[] basePackages = attributes.getStringArray("basePackages");
Class[] basePackageClasses = attributes.getClassArray("basePackageClasses");
这些代码给我们提供了借鉴。下面介绍一下三个引入类的作用:
- DubboConfigConfigurationRegistrar:将DubboConfigConfiguration.Single和DubboConfigConfiguration.Multiple注册到spring容器。Single和Multiple用于处理spring配置文件中与dubbo配置相关的配置信息。
- DubboComponentScanRegistrar:注册了后处理器ServiceAnnotationBeanPostProcessor,该后处理器会扫描@DubboComponentScan设置的包路径,将包路径下所有的@Service注解的类注册到spring容器。
- DubboLifecycleComponentRegistrar:注册了两个监听器到spring容器。
这个注解给我们的启示是,我们可以通过注解引入其他类,在引入类中注册监听器和后处理器到spring容器,还可以在引入类中获取注解配置信息,并且根据配置信息设置监听器和后处理器的属性。