自定义业务注解需用@interface声明,必须搭配@target和@retention元注解,支持@documented和@inherited;属性仅限特定类型、无参无异常、建议设default值;命名宜体现业务意图,如@riskcheck,且注解仅为元数据容器。

用 @interface 声明自定义业务注解,核心是模仿 Java 内置注解的语法规范,同时明确其作用范围、生命周期和使用场景。
基础结构:必须包含元注解
一个标准的业务注解需至少搭配 @Target 和 @Retention 两个元注解,否则编译器无法识别其适用位置和保留策略:
-
@Target 指定注解能用在哪些程序元素上(如类、方法、参数等),常用值:
ElementType.TYPE(类/接口)、ElementType.METHOD、ElementType.PARAMETER -
@Retention 控制注解存活时间,业务注解通常选
RetentionPolicy.RUNTIME,确保运行时可通过反射读取 - 可选加
@Documented(生成 Javadoc 时包含该注解)、@Inherited(允许子类继承)
定义注解成员:按需声明属性
注解中的方法声明即为“属性”,有固定规则:
- 返回类型只能是基本类型、String、Class、枚举、其他注解,或以上类型的数组
- 不能有参数,不能抛异常,不能有方法体(即不能写
{}) - 建议为每个属性提供默认值(用
default关键字),避免使用者强制赋值 - 常用属性名如
value()(当注解主要只接收一个值时,调用可省略名称)、description()、order()等
典型示例:一个订单校验业务注解
比如声明一个用于标记订单处理方法是否需风控校验的注解:
@Target({ElementType.METHOD, ElementType.TYPE})<br>
@Retention(RetentionPolicy.RUNTIME)<br>
@Documented<br>
public @interface RiskCheck {<br>
String value() default "DEFAULT";<br>
String description() default "";<br>
int level() default 1;<br>
Class extends RiskChecker> checker() default DefaultRiskChecker.class;<br>
}
这个注解可用于类或方法,运行时有效,支持指定校验级别、描述和自定义校验器实现。
注意事项与最佳实践
- 注解名建议用名词或形容词+Check/Validator/Handler 等后缀,体现业务意图,如
@InventoryLock、@Idempotent - 避免定义过多属性;若逻辑复杂,考虑拆分为多个专注单一职责的注解
- 如果注解需要被 Spring 等框架识别并自动处理,后续还需配合 AOP 或 BeanPostProcessor 实现增强逻辑
- 不要在注解中放业务逻辑或可变状态——它只是元数据容器










