千家信息网

dubbo中DubboComponentScanRegistrar的作用是什么

发表于:2025-01-29 作者:千家信息网编辑
千家信息网最后更新 2025年01月29日,dubbo中DubboComponentScanRegistrar的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收
千家信息网最后更新 2025年01月29日dubbo中DubboComponentScanRegistrar的作用是什么

dubbo中DubboComponentScanRegistrar的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

DubboComponentScanRegistrar

dubbo-2.7.3/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrar.java

public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar {    @Override    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {        Set packagesToScan = getPackagesToScan(importingClassMetadata);        registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);        registerReferenceAnnotationBeanPostProcessor(registry);    }    /**     * Registers {@link ServiceAnnotationBeanPostProcessor}     *     * @param packagesToScan packages to scan without resolving placeholders     * @param registry       {@link BeanDefinitionRegistry}     * @since 2.5.8     */    private void registerServiceAnnotationBeanPostProcessor(Set packagesToScan, BeanDefinitionRegistry registry) {        BeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class);        builder.addConstructorArgValue(packagesToScan);        builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);        AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();        BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);    }    /**     * Registers {@link ReferenceAnnotationBeanPostProcessor} into {@link BeanFactory}     *     * @param registry {@link BeanDefinitionRegistry}     */    private void registerReferenceAnnotationBeanPostProcessor(BeanDefinitionRegistry registry) {        // Register @Reference Annotation Bean Processor        BeanRegistrar.registerInfrastructureBean(registry,                ReferenceAnnotationBeanPostProcessor.BEAN_NAME, ReferenceAnnotationBeanPostProcessor.class);    }    private Set getPackagesToScan(AnnotationMetadata metadata) {        AnnotationAttributes attributes = AnnotationAttributes.fromMap(                metadata.getAnnotationAttributes(DubboComponentScan.class.getName()));        String[] basePackages = attributes.getStringArray("basePackages");        Class[] basePackageClasses = attributes.getClassArray("basePackageClasses");        String[] value = attributes.getStringArray("value");        // Appends value array attributes        Set packagesToScan = new LinkedHashSet(Arrays.asList(value));        packagesToScan.addAll(Arrays.asList(basePackages));        for (Class basePackageClass : basePackageClasses) {            packagesToScan.add(ClassUtils.getPackageName(basePackageClass));        }        if (packagesToScan.isEmpty()) {            return Collections.singleton(ClassUtils.getPackageName(metadata.getClassName()));        }        return packagesToScan;    }}
  • DubboComponentScanRegistrar实现了ImportBeanDefinitionRegistrar接口定义的registerBeanDefinitions方法;它首先通过getPackagesToScan方法从AnnotationMetadata读取要扫描的包,然后再执行registerServiceAnnotationBeanPostProcessor、registerReferenceAnnotationBeanPostProcessor方法

  • getPackagesToScan方法读取DubboComponentScan注解信息,获取要扫描的包;registerServiceAnnotationBeanPostProcessor方法则是通过BeanDefinitionReaderUtils.registerWithGeneratedName注册ServiceAnnotationBeanPostProcessor

  • registerReferenceAnnotationBeanPostProcessor方法则是通过BeanRegistrar.registerInfrastructureBean注册ReferenceAnnotationBeanPostProcessor

DubboComponentScanRegistrarTest

dubbo-2.7.3/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/DubboComponentScanRegistrarTest.java

public class DubboComponentScanRegistrarTest {    @BeforeEach    public void setUp() {        ConfigManager.getInstance().clear();    }    @AfterEach    public void tearDown() {        ConfigManager.getInstance().clear();    }    @Test    public void test() {        AnnotationConfigApplicationContext providerContext = new AnnotationConfigApplicationContext();        providerContext.register(ProviderConfiguration.class);        providerContext.refresh();        DemoService demoService = providerContext.getBean(DemoService.class);        String value = demoService.sayName("Mercy");        Assertions.assertEquals("Hello,Mercy", value);        Class beanClass = AopUtils.getTargetClass(demoService);        // DemoServiceImpl with @Transactional        Assertions.assertEquals(DemoServiceImpl.class, beanClass);        // Test @Transactional is present or not        Assertions.assertNotNull(findAnnotation(beanClass, Transactional.class));        AnnotationConfigApplicationContext consumerContext = new AnnotationConfigApplicationContext();        consumerContext.register(ConsumerConfiguration.class);        consumerContext.refresh();        ConsumerConfiguration consumerConfiguration = consumerContext.getBean(ConsumerConfiguration.class);        demoService = consumerConfiguration.getDemoService();        value = demoService.sayName("Mercy");        Assertions.assertEquals("Hello,Mercy", value);        ConsumerConfiguration.Child child = consumerContext.getBean(ConsumerConfiguration.Child.class);        // From Child        demoService = child.getDemoServiceFromChild();        Assertions.assertNotNull(demoService);        value = demoService.sayName("Mercy");        Assertions.assertEquals("Hello,Mercy", value);        // From Parent        demoService = child.getDemoServiceFromParent();        Assertions.assertNotNull(demoService);        value = demoService.sayName("Mercy");        Assertions.assertEquals("Hello,Mercy", value);        // From Ancestor        demoService = child.getDemoServiceFromAncestor();        Assertions.assertNotNull(demoService);        value = demoService.sayName("Mercy");        Assertions.assertEquals("Hello,Mercy", value);        providerContext.close();        consumerContext.close();    }}
  • DubboComponentScanRegistrarTest分别验证了providerContext、consumerContext

小结

  • DubboComponentScanRegistrar实现了ImportBeanDefinitionRegistrar接口定义的registerBeanDefinitions方法;它首先通过getPackagesToScan方法从AnnotationMetadata读取要扫描的包,然后再执行registerServiceAnnotationBeanPostProcessor、registerReferenceAnnotationBeanPostProcessor方法

  • getPackagesToScan方法读取DubboComponentScan注解信息,获取要扫描的包;registerServiceAnnotationBeanPostProcessor方法则是通过BeanDefinitionReaderUtils.registerWithGeneratedName注册ServiceAnnotationBeanPostProcessor

  • registerReferenceAnnotationBeanPostProcessor方法则是通过BeanRegistrar.registerInfrastructureBean注册ReferenceAnnotationBeanPostProcessor

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0