Spring番外篇-AliasFor注解

文章目录

    • @AliasFor的使用场景
      • 1. 同意义但不同名
      • 2. 组合注解
    • 需要注意的点

@AliasFor的使用场景

1. 同意义但不同名

假设有一个@TestGroovyConfig注解,注解内部定义的valuelocation都是一个意思,标识了groovy脚本的路径

(为什么要定义两个意义一样的属性呢? 方便调用者使用,例如value()属性可以省略key,而使用location()更加语义化)

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @interface TestGroovyConfig {

        /**
         * 标识了groovy脚本的路径
         */
        @AliasFor(attribute = "location")
        String[] value() default {};

        /**
         * 标识了groovy脚本的路径
         */
        @AliasFor(attribute = "value")
        String[] location() default {};

    }

那么通过@Alias注解标注后,无论获取value()还是location()都是等价的

    @TestGroovyConfig(value = {"zzzj.groovy", "1233.groovy"})
    class GroovyConfigClass1 {

    }

    @Test
    public void groovy_config_anno_test() throws Exception {

        // 1. 获取注解
        MergedAnnotation<TestGroovyConfig> annotation = MergedAnnotations.from(GroovyConfigClass1.class).get(TestGroovyConfig.class);

        // 2. 获取location属性
        String[] locations = annotation.getStringArray("location");

        // 3. 获取value属性
        String[] values = annotation.getStringArray("value");

        // 4.1 断言: locations = {"zzzj.groovy", "1233.groovy"}
        assertThat(locations)
                .hasSize(2)
                .containsExactly("zzzj.groovy", "1233.groovy");

        // 4.2 断言: equals( values , locations ) 
        assertThat(values).isEqualTo(locations);

    }

2. 组合注解

假设定义了这样一个组合注解,可以同时指定Dubbo和Spring的包扫描路径

那么声明这一个注解,就相当于同时声明了@ComponentScan@EnableDubbo

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @ComponentScan
    @DubboComponentScan
    @interface SpringDubboScan {

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

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

    }
    @SpringDubboScan(springPackages = "com.zzzj", dubboPackages = "com.1233")
    class ScannerClass {

    }

    @Test
    public void test1() throws Exception {

        // 1. 可以直接获取到@ComponentScan注解
        MergedAnnotation<ComponentScan> annotation = MergedAnnotations.from(ScannerClass.class)
                .get(ComponentScan.class);

        // 2. 断言: @ComponentScan.basePackages = ["com.zzzj"]
        assertThat(annotation.getStringArray("basePackages"))
                .isNotEmpty()
                .hasSize(1)
                .containsExactly("com.zzzj");

        // 3. 可以直接获取到@DubboComponentScan注解
        MergedAnnotation<DubboComponentScan> dubboComponentScan = MergedAnnotations.from(ScannerClass.class)
                .get(DubboComponentScan.class);

        // 4. 断言: @DubboComponentScan.basePackages = ["com.1233"]
        assertThat(dubboComponentScan.getStringArray("basePackages"))
                .hasSize(1)
                .containsExactly("com.1233");

    }

需要注意的点

@AliasFor声明的两个属性,必须

  • 类型相同
  • 默认值相同

你可能感兴趣的:(java)