自定义注解在 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映射(数据库表、字段)
- 多语言国际化
- 接口幂等 & 安全控制
1025

被折叠的 条评论
为什么被折叠?



