自定义注解常见的场景

自定义注解在 Java 开发 中用得非常广泛,尤其是和 反射AOP框架扩展 结合时。总结几个常见的场景:

1. 参数 & 字段校验

  • 常见于类似 Hibernate Validator / Spring Validation 的实现。
  • 例如:手机号、邮箱、身份证号、自定义业务规则。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Mobile {
    String message() default "手机号格式错误";
}

然后写解析器:

public class MobileValidator {
    public static void validate(Object obj) throws Exception {
        for (Field field : obj.getClass().getDeclaredFields()) {
            if (field.isAnnotationPresent(Mobile.class)) {
                field.setAccessible(true);
                String value = (String) field.get(obj);
                if (!value.matches("^1[3-9]\\d{9}$")) {
                    throw new IllegalArgumentException(field.getName() + " 手机号格式错误");
                }
            }
        }
    }
}

🔹 2. 权限控制

  • 类似于 Spring Security 的 @PreAuthorize@RolesAllowed
  • 在 Controller 或 Service 方法上加自定义注解,配合 AOP 进行校验。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequirePermission {
    String value();
}

3. 日志记录 / 审计

  • 用于统一操作日志记录,比如某个方法被调用时自动记录操作人、时间、参数。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
    String value() default "";
}

结合 AOP 切面实现:

@Around("@annotation(log)")
public Object logOperation(ProceedingJoinPoint pjp, OperationLog log) throws Throwable {
    System.out.println("操作日志: " + log.value());
    return pjp.proceed();
}

4. 缓存控制

  • 类似于 Spring 的 @Cacheable
  • 可以自定义 @LocalCache,在方法执行时自动查询缓存,不命中再执行。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LocalCache {
    String key();
    int expireSeconds() default 60;
}

🔹5. 重试 / 幂等

  • 通过注解控制方法是否需要重试、如何保证幂等。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {
    int maxAttempts() default 3;
    long delay() default 1000;
}

6. 多语言(i18n)

  • 给字段或接口标记需要国际化翻译的内容。
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface I18n {
    String key();
}

7. ORM / SQL 映射

  • 类似 MyBatis、JPA 里的 @Table@Column
  • 自定义 ORM 框架时常用。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String name();
}

8. 接口幂等 Token

  • 标记需要校验幂等 Token 的接口。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
    String key();
}

总结
常见场景主要集中在:

  • 数据校验(@NotNull、@Email、自定义校验)
  • AOP增强(日志、权限、事务、缓存、重试)
  • ORM映射(数据库表、字段)
  • 多语言国际化
  • 接口幂等 & 安全控制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值