dubbo必须配置注解@EnableDubbo。
@EnableDubbo整合了其他三个注解@EnableDubboConfig、@DubboComponentScan、@EnableDubboLifecycle。
1、@EnableDubboConfig引入类DubboConfigConfigurationRegistrar;
2、@DubboComponentScan引入类DubboComponentScanRegistrar;
3、@EnableDubboLifecycle引入类DubboLifecycleComponentRegistrar。
一般我们需要配置@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");
这些代码给我们提供了借鉴。下面介绍一下三个引入类的作用:
1、DubboConfigConfigurationRegistrar:将DubboConfigConfiguration.Single和DubboConfigConfiguration.Multiple注册到spring容器。Single和Multiple用于处理spring配置文件中与dubbo配置相关的配置信息。
2、DubboComponentScanRegistrar:注册了后处理器ServiceAnnotationBeanPostProcessor,该后处理器会扫描@DubboComponentScan设置的包路径,将包路径下所有的@Service注解的类注册到spring容器。
3、DubboLifecycleComponentRegistrar:注册了两个监听器到spring容器。
这个注解给我们的启示是,我们可以通过注解引入其他类,在引入类中注册监听器和后处理器到spring容器,还可以在引入类中获取注解配置信息,并且根据配置信息设置监听器和后处理器的属性。