@AliasFor的使用场景
1. 同意义但不同名
假设有一个@TestGroovyConfig
注解,注解内部定义的value
和location
都是一个意思,标识了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声明的两个属性,必须
- 类型相同
- 默认值相同