| 注解 |
说明 |
| @Data |
用在类上,提供Getter、Setter、equals、hasCode、toString 、构造方法(参数:@NonNull和final字段) |
| @AllArgsConstructor |
用在类上,提供全参数构造方法 |
| @NoArgsConstructor |
用在类上,提供无参构造方法 |
| @RequiredArgsConstructor |
用在类上,提供构造方法(参数:@NonNull和final字段) |
| @Value |
用在类上,提供 get、equals、hashCode、toString、全参数构造方法 |
| @EqualsAndHashCode |
用在类上,提供equals、hasCode方法,继承父类使用 @EqualsAndHashCode(callSuper = true) |
| @NonNull |
用在字段上,提供无参构造方法,为空则抛出NullPointerException |
| @Cleanup |
用在字段上,释放资源,try{}finally{} |
| @SneakyThrows |
用在类上,捕获异常,指定异常@SneakyThrows(Exception.class) |
注解 @Getter @Setter,@Getter 支持懒加载
@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface Getter { lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC; AnyAnnotation[] onMethod() default {}; boolean lazy() default false; }
|
@Target({ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.SOURCE) public @interface Setter { lombok.AccessLevel value() default lombok.AccessLevel.PUBLIC; AnyAnnotation[] onMethod() default {}; AnyAnnotation[] onParam() default {}; }
|
| AccessLevel |
描述 |
| PUBLIC |
生成 public 修饰的 getter setter 方法 |
| MODULE |
生成没有修饰符修饰的 getter setter 方法 |
| PROTECTED |
生成 protected 修饰的 getter setter 方法 |
| PACKAGE |
生成没有修饰符修饰的 getter setter 方法 |
| PRIVATE |
生成 private 修饰的 getter setter 方法 |
| NONE |
不生成 getter setter 方法 |
注解 @EqualsAndHashCode
@Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) public @interface EqualsAndHashCode { String[] exclude() default {}; String[] of() default {}; boolean callSuper() default false; boolean doNotUseGetters() default false; }
|
| 属性 |
描述 |
| exclude |
在生成的 equals 和 hashCode 方法中排除的字段 |
| of |
在生成的 equals 和 hashCode 方法中列出的字段 |
| callSuper |
属性设置为 true,表示父类的 equals 和 hashCode 参与计算,默认为 false |
| doNotUseGetters |
通常都是通过字段的 getter 方法获取字段值,设置为 true,表示不通过 getter 方法获取,而是直接访问字段值,默认为 false |
注解 @Accessors ,配合 @Setter、@Getter 、@Data 注解,用在类上和字段上
| 属性 |
描述 |
| fluent |
默认为 false,如果为 true 则生成的 getter/setter 方法没有 set/get 前缀,如果为 true, chain 未设置,则 chain 会被设置为 true |
| chain |
默认为 false, setter 方法返回是 void,如果为 true 则返回 this,当 fluent 为 true 时,chain 会设置为 true |
| prefix |
getter setter 方法时会去掉指定的前缀 |
注解 Log
| 注解 |
描述 |
| @CommonsLog |
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class) |
| @JBossLog |
org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class) |
| @Log |
java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName()) |
| @Log4j |
org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class) |
| @Log4j2 |
org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class) |
| @Slf4j |
org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class) |
| @XSlf4j |
org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class) |
详情见 使用 Lombok 进行 Java 开发
使用 @Data 会遇到什么坑,看下 Mybatis 的 PropertyNamer 类 ,methodToProperty 方法转属性
public static String methodToProperty(String name) { if (name.startsWith("is")) { name = name.substring(2); } else if (name.startsWith("get") || name.startsWith("set")) { name = name.substring(3); } return name; }
|
测试
@Data public class Test { private boolean isTrue; private String mName; private Boolean isFalse;
public static void main(String[] args) { Test test = new Test(); test.getMName(); test.isTrue();
System.out.println(PropertyNamer.methodToProperty("getMName")); System.out.println(PropertyNamer.methodToProperty("isTrue"));
test.getIsFalse(); System.out.println(PropertyNamer.methodToProperty("getIsFalse")); } }
|
可以看出 Mybatis 把 @Data 生成的方法转属性之后,跟原属性对不上,所以使用的时候, boolean 类型 不要 is加大写字母命名,其它基本类型属性不要 第一个字母小写 第二个字母大写 命名
如果类实现 Serializable接口, boolean 类型的字段命令为 isTrue 的会有问题 ,字段序列号后是 true
如果要 Builder 链式调用父类的字段 ,父类和子类都要加 @SuperBuilder
Coffee.builder().name("name").id(100L).build();
@SuperBuilder @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class Coffee extends BaseEntity implements Serializable { @NotBlank(message = "name can not be null") private String name; }
|
@SuperBuilder @AllArgsConstructor @NoArgsConstructor @Setter @Getter public class BaseEntity implements Serializable { private long id; }
|