作用:帮使用者提高编码效率,减少重复与冗余的代码
原理:ASM 动态修改class文件
我曾经是一名 .Net 开发,如今的我是一名 Java 开发者。在我享受着 Java 成熟的生态时,我常常怀念 c# 简洁的语法:自动属性、类型推断、自动初始化器 ....
鱼,我所欲也,熊掌亦我所欲也; 二者不可得兼;
直到我遇到了 lombok 。
添加依赖及 IDE 插件
<!--引入Lombok相关依赖,用于避免数据Get Set方法的重复创建-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
因为 lombok 要在编译器编译时通过操作AST(抽象语法树)改变字节码生成,因此为了让 IDE 能够支持 lombok 需要给 IDE 添加相关插件,下面是 Idea 添加插件的方法:
一个典型的Java类
package com.pingkeke.springBoot.entity;
import com.pingkeke.springBoot.enums.UserSexEnum;
/**
* UserEntity.
*/
public class UserEntity {
private static final long serialVersionUID = 1L;
private Long id;
private String userName;
private String passWord;
private UserSexEnum userSex;
private String nickName;
public UserEntity() {
super();
}
public UserEntity(String userName, String passWord, UserSexEnum userSex) {
super();
this.passWord = passWord;
this.userName = userName;
this.userSex = userSex;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public UserSexEnum getUserSex() {
return userSex;
}
public void setUserSex(UserSexEnum userSex) {
this.userSex = userSex;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "userName " + this.userName
+ ", pasword " + this.passWord
+ "sex " + userSex.name();
}
}
package com.pingkeke.springBoot.enums;
/**
* UserSexEnum.
*/
public enum UserSexEnum {
MAN, WOMAN
}
对于这样一个简单的 Java 类,我们通常需要给每个属性写 getXXX() 和 setXXX() 方法,有时候还要重写 equals()、 hashCode()、
toString()等方法。在开发的过程中,重复编写这些“没有技术含量”的代码,对程序员来说是一个很枯燥无趣的事情,也增加了很大的工作负担。
针对这种情况,Lombok 提供了一种机制,基于注解的方式,帮助我们自动生成这些样板代码。
Lombok注解
package com.pingkeke.springBoot.entity;
import com.pingkeke.springBoot.enums.UserSexEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* UserEntity.
* @Data
@ToString、 @EqualsAndHashCode、 @Getter、 @Setter 和 @RequiredArgsConstructor 注解的集合。
@NoArgsConstructor
作用于类,@NoArgsConstructor 自动生成不带参数的构造方法;
@AllArgsConstructor
@AllArgsConstructor 自动生成包含所有属性的构造方法。
@Accessors有三个参数可以使用
chain 链式的形式
fluent 流式的形式
prefix 生成指定前缀的属性的getter与setter方法,并且生成的getter与setter方法时会去除前缀
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class UserEntity {
private Long id;
private String userName;
private String passWord;
private UserSexEnum userSex;
private String nickName;
}