EnableDubbo注解解析(二)------ DubboComponentScan注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@EnableDubboConfig    //读取配置文件 创建dubbo配置bean
@DubboComponentScan   //扫描 @Service(不是spring的Sevice注解) @Reference 生成 bean
public @interface EnableDubbo {

    @AliasFor(annotation = DubboComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};

    @AliasFor(annotation = DubboComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(annotation = EnableDubboConfig.class, attribute = "multiple")
    boolean multipleConfig() default true;

}

DubboComponentScan注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(DubboComponentScanRegistrar.class) //看到导入进来的DubboComponentScanRegistrar
public @interface DubboComponentScan {
    String[] value() default {};
    
    String[] basePackages() default {};

    Class<?>[] basePackageClasses() default {};

}

DubboComponentScanRegistrar

public class DubboComponentScanRegistrar implements ImportBeanDefinitionRegistrar {
	
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
		
	    //获取要扫描的包路径
        Set<String> packagesToScan = getPackagesToScan(importingClassMetadata);
		
		//注册ServiceAnnotationBeanPostProcessor来扫描含有Service注解的类 注冊到spring容器中
        registerServiceAnnotationBeanPostProcessor(packagesToScan, registry);
        
		//注册ReferenceAnnotationBeanPostProcessor来扫描含有Reference注解字段和方法,实现依赖注入
        registerReferenceAnnotationBeanPostProcessor(registry);

    }

    private void registerServiceAnnotationBeanPostProcessor(Set<String> packagesToScan, BeanDefinitionRegistry registry) {
		
        BeanDefinitionBuilder builder = rootBeanDefinition(ServiceAnnotationBeanPostProcessor.class);
        //将扫描的包路径通过构造函数传给ServiceAnnotationBeanPostProcessor
        builder.addConstructorArgValue(packagesToScan);
        builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
        AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
        BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry);

    }

    private void registerReferenceAnnotationBeanPostProcessor(BeanDefinitionRegistry registry) {

        // Register @Reference Annotation Bean Processor
        BeanRegistrar.registerInfrastructureBean(registry,
                ReferenceAnnotationBeanPostProcessor.BEAN_NAME, ReferenceAnnotationBeanPostProcessor.class);

    }

    private Set<String> getPackagesToScan(AnnotationMetadata metadata) {
    	//获取DubboComponentScan注解的属性
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(
                metadata.getAnnotationAttributes(DubboComponentScan.class.getName()));
        //获取包路径
        String[] basePackages = attributes.getStringArray("basePackages");
        //获取类
        Class<?>[] basePackageClasses = attributes.getClassArray("basePackageClasses");
        //获取value属性值
        String[] value = attributes.getStringArray("value");
        //所有要扫描的包路径packagesToScan 
        //将各个属性对应的包名加入到packagesToScan 中
        Set<String> packagesToScan = new LinkedHashSet<String>(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;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值