可继承的领域模型自定义标签需用@Inherited配合@Target(ElementType.TYPE)和@Retention(RetentionPolicy.RUNTIME),仅对类级注解生效,子类通过反射可获取父类标注;@Documented和@Repeatable按需增强可维护性与多实例支持。

要构建可继承的领域模型自定义标签,核心不是让“注解本身被继承”,而是让标注在父类上的注解能被子类在反射中自然识别——这依赖 @Inherited 的正确使用,再配合 @Target 和 @Retention 的精准配置。其他元注解按需补充,不可遗漏或误配。
只对类级注解生效:@Inherited 的适用边界
@Inherited 不是 Java 语义上的继承机制,它仅影响 类声明级别(ElementType.TYPE)的注解在反射时的行为。当子类未显式声明同一注解,但调用 getAnnotation(YourDomainTag.class) 时,JVM 会自动向上查找父类是否标注了该注解(且该注解带 @Inherited)。
- 若注解目标是方法、字段或参数,加 @Inherited 完全无效
- 子类必须是直接继承(
extends),实现接口(implements)不触发继承逻辑 - 父类注解必须声明为
@Retention(RetentionPolicy.RUNTIME),否则运行时根本读不到
限定作用位置与生命周期:@Target 和 @Retention 是前提
没有它们,@Inherited 就失去意义。领域模型标签通常用于实体类、聚合根或值对象,因此:
- 必须明确指定
@Target(ElementType.TYPE)—— 不加则默认只允许用于类/接口/枚举,但显式声明更清晰、防误用 - 必须声明
@Retention(RetentionPolicy.RUNTIME)—— 这是反射读取的基础,CLASS 或 SOURCE 阶段无法支撑运行时领域逻辑判断 - 若未来需支持泛型类型参数(如
List<@Aggregate String>),还需额外加上ElementType.TYPE_USE
增强可维护性:@Documented 和 @Repeatable 按需启用
这两个元注解不参与继承逻辑,但在领域建模中提升协作效率:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
@Documented让 Javadoc 自动生成标签说明,例如开发者查看User类文档时,立刻看到 “@Aggregate 标识该类为聚合根” -
@Repeatable适用于需要多实例语义的场景,比如一个领域对象可归属多个业务域:@DomainArea("finance") @DomainArea("risk") public class Account { },此时需配套定义容器注解
完整示例:可继承的 @Aggregate 标签
以下是一个典型领域模型标签定义:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface Aggregate {
String value() default "";
}
使用方式:
@Aggregate("订单")
public class Order { }
public class InternationalOrder extends Order { } // 自动继承 @Aggregate
反射验证:
Class<?> sub = InternationalOrder.class; Aggregate ann = sub.getAnnotation(Aggregate.class); // 返回非 null,value = "订单"

















