元注解是支撑设计模式落地的底层基础设施,通过@target限定作用位置、@retention(retentionpolicy.runtime)保障运行时可见、@repeatable支持装饰器链式组合、@inherited实现类继承传递,分别赋能代理、策略、装饰器和模板方法模式。

注解本身不是设计模式,但它在实现多种设计模式时扮演关键角色。元注解是支撑这一能力的底层基础设施——它们不直接参与业务逻辑,却决定了自定义注解能否被正确识别、保留和读取,进而影响代理、装饰、策略、工厂等模式的落地效果。
元注解如何支撑代理模式
动态代理常用于AOP场景,比如日志、权限、事务拦截。要让框架自动识别哪些方法需要增强,就得靠注解标记,而这个注解必须能被运行时读取。
- @Target(ElementType.METHOD) 确保只标注在方法上,避免误用
- @Retention(RetentionPolicy.RUNTIME) 是核心——只有设为RUNTIME,代理处理器(如InvocationHandler)才能通过反射获取到该注解
- 若省略@Retention或设为CLASS/SOURCE,代理逻辑根本“看不见”注解,增强就会失效
元注解与策略模式的结合
策略模式需在运行时根据条件选择不同算法实现。注解可作为轻量级配置,替代硬编码的if-else或Map注册。
- 定义@PayStrategy(type = "ALIPAY"),其中type是枚举属性,标识具体策略类型
- @Target({ElementType.TYPE, ElementType.METHOD}) 允许注解加在策略实现类上,也支持加在调用点作声明式指定
- @Documented 可选但实用:生成API文档时自动带出策略语义,提升团队协作可读性
@Repeatable支持装饰器链式组合
装饰器模式强调功能叠加,传统方式需层层嵌套构造器。Java 8起,@Repeatable让同一位置可声明多个同类注解,天然适配装饰链。
- 例如定义@Cacheable、@Retryable、@Traceable三个注解,并用@Repeatable(Cacheables.class)修饰
- 方法上可同时写 @Cacheable @Retryable @Traceable,框架解析时自动聚合为装饰器列表
- 注意:@Repeatable必须配套一个容器注解(如Cacheables),且容器的value()需返回对应注解数组
@Inherited与模板方法的继承传递
模板方法模式依赖父类定义流程骨架,子类复写钩子。若希望子类自动继承父类上的行为标记(如@NeedAudit),@Inherited就很有价值。
- 仅对类级别注解生效(ElementType.TYPE),且只作用于class继承关系,接口实现不传递
- 搭配@Retention(RetentionPolicy.RUNTIME),确保子类Class对象调用getAnnotation()时能回溯到父类注解
- 不适用于方法或字段——这是常见误区,需额外通过反射遍历父类Method/Field手动查找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











