AliasFor
@AliasFor 是 Spring 框架中的一个元注解(meta-annotation),用于声明注解中属性之间的别名关系。
这意味着当一个注解属性被标记为 @AliasFor,它就可以作为另一个注解属性的别名。这样可以在使用注解时提供更大的灵活性,
并允许开发者以不同的方式指定相同的属性值。
示例用法
假设有一个自定义注解 @MyCustomAnnotation 如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyCustomAnnotation {
String value() default "";
@AliasFor("value")
String name() default "";
}
在这个例子中,name() 方法通过 @AliasFor("value") 被标记为 value() 属性的别名。这意味着如果我们在类上使用这个注解并设置 name 属性,那么它也会自动应用于 value 属性:
@MyCustomAnnotation(name = "exampleName")
public class MyClass {
// ...
}
等价于:
@MyCustomAnnotation(value = "exampleName")
public class MyClass {
// ...
}
使用场景
-
简化配置:
- 当注解有多个可选名称表示同一含义时(如
value和name)。
- 当注解有多个可选名称表示同一含义时(如
-
迁移兼容性:
- 当需要支持旧版本的属性名称时。
-
复合注解:
- 当创建复合注解时,可以使用
@AliasFor来避免在内部注解中重复相同的属性名称。
- 当创建复合注解时,可以使用
-
别名传递性:
- 如果
@One#name显示覆盖了@Two#nameAlias,而@Two#nameAlias又显示覆盖了@Three#nameAlias,则因为别名的传递性,@One#name实际上也覆盖了@Three#nameAlias。
- 如果
-
与
@Inherited结合使用:- 如果一个子注解需要继承父注解的某些属性,则可以在子注解中使用
@AliasFor标记这些属性。
- 如果一个子注解需要继承父注解的某些属性,则可以在子注解中使用
注意事项
@AliasFor只能用于 Spring 的注解处理逻辑,它不是 Java 标准的一部分。@AliasFor不影响编译时的行为,它主要用于运行时处理注解的工具和框架。
实际应用
使用框架的 @RequestMapping 注解作为元注解:
创建一个组合注解 @MyMapping,使用框架的 @RequestMapping 注解作为元注解:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RequestMapping
public @interface MyMapping {
@AliasFor(annotation = RequestMapping.class, attribute = "method")
RequestMethod[] action() default {};
}
在 @MyMapping 中,action 是 @RequestMapping 中属性 method 的显式别名。
也就是说,组合注解中的 action 重写了元注解中的 method。
与注解中的别名类似,元注解属性别名也必须具有相同的返回类型。例如,在本例中就是 RequestMethod[]。
另外,属性 annotation 应引用元注解,在本例中就是 annotation = RequestMapping.class。
接下来,创建一个名为 MyMappingController 的 Controller 类,使用自定义注解来进行演示。
如下,这里只为 @MyMapping 添加两个属性:route 和 action:
@Controller
public class MyMappingController {
@MyMapping(action = RequestMethod.PATCH, route = "/test")
public void mappingMethod() {}
}