You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建可同时应用多注解的复合注解?以Lombok注解组合为例

如何创建包含Lombok常用注解的复合注解

嘿,这个问题我刚好踩过坑!直接堆叠注解不生效是因为Lombok默认不会自动识别自定义注解上的其他Lombok注解,得按照正确的姿势来创建复合注解,下面一步步教你:

1. 先搞懂为什么直接堆叠不行

Lombok的注解处理器只会处理直接标注在类/字段上的它自己的注解,如果你只是把@Getter、@Setter等堆在自定义注解上,处理器根本不会“看”到这些嵌套的注解,自然不会生效。我们需要明确告诉Lombok:这个自定义注解是一个复合注解,里面的Lombok注解要一并生效。

2. 创建你的复合注解

创建一个新的注解类,在上面添加想要复合的Lombok注解,同时配置必要的元注解(@Target、@Retention):

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 指定这个注解只能用在类上,和你要复合的Lombok注解目标匹配
@Target(ElementType.TYPE)
// 保留到源码级别即可,因为Lombok是编译时处理的
@Retention(RetentionPolicy.SOURCE)
// 堆叠你想要的Lombok注解
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public @interface DataBundle {
    // 可选:如果需要给复合的注解传递参数,用@AliasFor映射
    // 比如自定义@AllArgsConstructor的访问级别:
    // @AliasFor(annotation = AllArgsConstructor.class, attribute = "access")
    // lombok.AccessLevel access() default lombok.AccessLevel.PUBLIC;
}

3. 用起来试试

现在你只需要在实体类上标注这个自定义注解,效果和同时加四个Lombok注解完全一样:

@DataBundle
public class User {
    private Long id;
    private String username;
    private String email;
}

几个关键注意点

  • 元注解要匹配:自定义注解的@Target要和你复合的Lombok注解的适用范围一致,比如这里我们的复合注解是给类用的,所以设为ElementType.TYPE;如果要给字段用,就改成ElementType.FIELD。
  • 参数传递(可选):如果需要给某个Lombok注解指定特殊参数(比如把构造方法设为protected),可以在自定义注解里定义对应的属性,再用@AliasFor把它映射到目标Lombok注解的属性上,就像上面注释的例子那样。
  • 版本要求:确保你的Lombok版本在1.18.4及以上,这个版本才正式支持复合注解的功能,老版本可能不生效。

内容的提问来源于stack exchange,提问作者bezbos.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:39