如何创建可同时应用多注解的复合注解?以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.
相关产品推荐
相关产品推荐

