一、lombok是什么
java中的javabean需要添加相应的getter/setter,即使idea等都提供了自动生成的功能,但是一旦需要修改,哪怕只是修改一个属性的类型、变量名,都得先删除原先的、再重新自动生成。Lombok就是来解决这个麻烦的。
Lombok通过注解的方式,在编译时自动为属性生成构造函数、getter/setter、equals()、hashcode()、toString()方法。虽然源码中没有getter/setter等方法,但是在编译生成的字节码文件中却有这些方法。
二、lombok的基本使用
1、idea中安装lombok插件
打开idea的settings,点击Plugins,在搜索框中输入lombok进行搜索安装即可。
2、在springboot的项目加入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3、javabean上加上注解
import lombok.Data;
import java.io.Serializable;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
// 加上Data注解,编译时会自动生成setter/getter/equals/canEqual/hashCode/toString方法,如为final属性,则不会为该属性生成setter方法。
@Data
public class User implements Serializable {
private String id;
private String name;
private String password;
}
三、lombok常用注解
注解 | 说明 | |
---|---|---|
1 | @Data | 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。 |
2 | @Slf4j | 类级别注解,生成log常量。 加上这个注解,会在编译时生成如下的常量声明 private static final Logger log = LoggerFactory.getLogger(AdminController.class); 就不用自己声明log,就可以直接在代码中使用log |
3 | @Setter | 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。 |
4 | @Getter | 使用方法同Setter,区别在于生成的是getter方法。 |
5 | @ToString | 注解在类,添加toString方法。 |
6 | @EqualsAndHashCode | 注解在类,生成hashCode和equals方法。 |
7 | @NoArgsConstructor | 注解在类,生成无参的构造方法。 |
8 | @RequiredArgsConstructor | 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。 |
9 | @AllArgsConstructor | 注解在类,生成包含类中所有字段的构造方法。 |
四、其他
(一)Data注解帮我们生成了哪些方法?
1、源码中加上Data注解
package org.chushiyan.em.pojo;
import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
@Data
public class User implements Serializable {
private String id;
@NotNull(message = "姓名不能为空")
@Size(min = 2, max = 20, message = "姓名长度必须在2-20之间")
private String name;
@NotNull(message = "密码不能为空")
@Size(min = 6, max = 60, message = "密码长度必须在6-60之间")
private String password;
}
2、根据生成的class反编译后的代码
这里使用的Java Decompiler反编译工具,下载使用详见官网:Java Decompiler
package org.chushiyan.em.pojo;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User implements Serializable {
private String id;
@NotNull(message = ")
@Size(min = 2, max = 20, message = ")
private String name;
@NotNull(message = ")
@Size(min = 6, max = 60, message = ")
private String password;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof User))
return false;
User other = (User)o;
if (!other.canEqual(this))
return false;
Object this$id = getId(), other$id = other.getId();
if ((this$id == null) ? (other$id != null) : !this$id.equals(other$id))
return false;
Object this$name = getName(), other$name = other.getName();
if ((this$name == null) ? (other$name != null) : !this$name.equals(other$name))
return false;
Object this$password = getPassword(), other$password = other.getPassword();
return !((this$password == null) ? (other$password != null) : !this$password.equals(other$password));
}
protected boolean canEqual(Object other) {
return other instanceof User;
}
public int hashCode() {
int PRIME = 59;
result = 1;
Object $id = getId();
result = result * 59 + (($id == null) ? 43 : $id.hashCode());
Object $name = getName();
result = result * 59 + (($name == null) ? 43 : $name.hashCode());
Object $password = getPassword();
return result * 59 + (($password == null) ? 43 : $password.hashCode());
}
public String toString() {
return "User(id=" + getId() + ", name=" + getName() + ", password=" + getPassword() + ")";
}
public String getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getPassword() {
return this.password;
}
}
说明Data注解会为类的属性自动生成setter/getter、equals、canEqual、hashCode、toString方法。
(二)我们自己编写的toString()等方法会被lombok覆盖掉吗
1、源码
自己编写(或者使用idea自动生成)equals()/hashCode()/toString()
package org.chushiyan.em.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
/**
* @author chushiyan
* @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
* @description
*/
@Data
@NoArgsConstructor
public class User implements Serializable {
private String id;
@NotNull(message = "姓名不能为空")
@Size(min = 2, max = 20, message = "姓名长度必须在2-20之间")
private String name;
@NotNull(message = "密码不能为空")
@Size(min = 6, max = 60, message = "密码长度必须在6-60之间")
private String password;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (id != null ? !id.equals(user.id) : user.id != null) return false;
return name != null ? name.equals(user.name) : user.name == null;
}
@Override
public int hashCode() {
int result = id != null ? id.hashCode() : 0;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
2、根据生成的class反编译后的代码
package org.chushiyan.em.pojo;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User implements Serializable {
private String id;
@NotNull(message = ")
@Size(min = 2, max = 20, message = ")
private String name;
@NotNull(message = ")
@Size(min = 6, max = 60, message = ")
private String password;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getId() {
return this.id;
}
public String getName() {
return this.name;
}
public String getPassword() {
return this.password;
}
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
User user = (User)o;
if ((this.id != null) ? !this.id.equals(user.id) : (user.id != null))
return false;
return (this.name != null) ? this.name.equals(user.name) : ((user.name == null));
}
public int hashCode() {
int result = (this.id != null) ? this.id.hashCode() : 0;
result = 31 * result + ((this.name != null) ? this.name.hashCode() : 0);
return result;
}
public String toString() {
return "User{id='" + this.id + '\'' + ", name='" + this.name + '\'' + '}';
}
}
可以看到,equals()/hashCode()/toString()都是一样的。说明lombok对于已经存在的方法不会覆盖掉。