注解 |
说明 |
@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; }
|