目录java
https://zhuanlan.zhihu.com/p/32779910spring
lombok概念和基本使用,看这一篇就足够了数据库
见如下代码api
@Getter @Setter public class FishermanDemo { private String username; private Integer time; public String getUsername(){ System.out.println("hello world"); return "hello username"; } public void setTime(Integer time){ System.out.println("hello time"); this.time = time; } }
编译后的class文件springboot
public class FishermanDemo { private String username; private Integer time; public FishermanDemo() { } public String getUsername() { System.out.println("hello world"); return "hello username"; } public void setTime(Integer time) { System.out.println("hello time"); this.time = time; } public Integer getTime() { return this.time; } public void setUsername(String username) { this.username = username; } }
咱们能够看出,lombok编译后的代码不会覆盖咱们本身写的getter/setter方法。通常状况下,咱们不会本身写getter/setter方法,可是也有些特殊的地方。好比POJO对象若是有时间类型,而且保存的类型和数据库字段不一致,那么这个时候就须要本身定义该时间类型的getter/setter方法,由于像Mybatis这样的框架是经过getter/setter方法来获取和注入值的。框架
咱们看源文件工具
@Data public class FishermanDemo { private String username; private Integer time; }
反编译后的文件开发工具
public class FishermanDemo { private String username; private Integer time; public FishermanDemo() { } public String getUsername() { return this.username; } public Integer getTime() { return this.time; } public void setUsername(String username) { this.username = username; } public void setTime(Integer time) { this.time = time; } public boolean equals(Object o) { if (o == this) { return true; } else if (!(o instanceof FishermanDemo)) { return false; } else { FishermanDemo other = (FishermanDemo)o; if (!other.canEqual(this)) { return false; } else { Object this$username = this.getUsername(); Object other$username = other.getUsername(); if (this$username == null) { if (other$username != null) { return false; } } else if (!this$username.equals(other$username)) { return false; } Object this$time = this.getTime(); Object other$time = other.getTime(); if (this$time == null) { if (other$time != null) { return false; } } else if (!this$time.equals(other$time)) { return false; } return true; } } } protected boolean canEqual(Object other) { return other instanceof FishermanDemo; } public int hashCode() { int PRIME = true; int result = 1; Object $username = this.getUsername(); int result = result * 59 + ($username == null ? 43 : $username.hashCode()); Object $time = this.getTime(); result = result * 59 + ($time == null ? 43 : $time.hashCode()); return result; } public String toString() { return "FishermanDemo(username=" + this.getUsername() + ", time=" + this.getTime() + ")"; } }
咱们能够看到 反编译后的文件有 getter/setter、无参构造器、equal、hascode、toString。咱们常常使用的POJO对象通常只有getter/setter、无参构造器、有参数构造器、toString。所以咱们能够用如下5个注解。this
@Setter @Getter @NoArgsConstructor @AllArgsConstructor @ToString
这个属于POJO对象基本约束规范,不要使用基本数据类型。spa
lombok对基本数据类型boolean反编译后的结果和Boolean类型有一些不一致。
假设private boolean sex, boolean基本类型sex的getter/setter方法以下,isSex和setSex,而Boolean就是正常的getSex和setSex
使用lombok的注解 @ToString 打印出来的结果以下:
Student(name=Mahesh, age=21) // name后面的值 没有''
而使用IDEA 自动生成的toString方法 打印出来的结果以下:
Student{name='Mahesh', age=21} // name 后面的值 有''
能够看出来,IDEA自动生成的ToString方法,若是属性是字符串,那么调用toString方法的时候,会比lombok的toString方法多一个 ''
使用lombok有一个最大的缺陷,就是在团队中全部开发人员都须要安装相关的lombok插件
lombok很神奇,很咱们以往使用jar包彻底不同,它必需要求开发工具安装相应的jar包,缘由就是跟lombok底层实现原理有很大的关系。
lombok利用JSR269 api(Pluggable Annotation Processing API )建立编译期的注解处理器,注意全部的@Getter、@Setter、@Data、@ToString方法都是编译期注解 @Retention(RetentionPolicy.SOURCE)
这跟springboot等在运行期间利用反射获取注解相关的值彻底不同。而lombok可以在编译期就完成这些难以想象的工做,彻底是由于JSR269的规范,容许在编译时指定一个processor类来对编译阶段的注解进行干预。
简单一句话,经过JSR269规范,容许你对一个类,在编译期间进行相应的更改,好比增长一些方法。
所以相关的开发工具例如IDEA、Eclipse彻底不知道这些方法的存在
@Getter public class FishermanDemo { private String username; }
反编译后的class文件
public class FishermanDemo { private String username; public FishermanDemo() { } public String getUsername() { return this.username; } }
若是这个时候直接调用getUsername()
FishermanDemo fishermanDemo = new FishermanDemo(); fishermanDemo.getUsername();
开发工具的编译期会报错,由于他们彻底不知道getUsername()方法的存在,所以必须安装相关的lombok插件,才能使开发工具不报错。
参考资料
https://blog.mythsman.com/2017/12/19/1/#more
https://zhuanlan.zhihu.com/p/32779910