一、简介
1.前言
在SpringCloud项目开发过程中,需要使用数据模型对使用者进行身份验证以及业务等数据信息传递。一般情况下,我们会采用Java中Getter和Setter方法对属性进行相关设置,但在SpringCloud的业务开发流程中这种方式便会显得比较臃肿和繁琐。因此我们需要采用一个Java库,能够帮助我们自动生成相应的方法。我们可以通过Lombok实现相应的功能。
2.Lombok简介
Lombok在SpringCloud开发过程中可以通过注释简化Java代码,在编译过程中会自动生成需要的代码。常用注解如下:
- @Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
- @Getter 使用方法同上,区别在于生成的是getter方法。
- @ToString 注解在类,添加toString方法。
- @EqualsAndHashCode 注解在类,生成hashCode和equals方法。
- @NoArgsConstructor 注解在类,生成无参的构造方法。
- @RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
- @AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
- @Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
- @Slf4j 注解在类,生成log变量。
二、Lombok运行原理
1.运行时解析
Java是静态语言,每一次运行都需要编译,因此Lombok在运行时解析就需要借助Java的反射机制。在运行过程中,Lombok会将@Retention设置为RUNTIME,此时Lombok会使用Java.lang.reflect包中的AnnotatedElement接口实现相应的方法。
2.编译时解析
javac在编译时会形成抽象语法树,此时Lombok就对得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点,最后javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点。
三、功能演示
在Maven项目中需要引入Lombok组件
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
1.@Data注解
在创建数据模型时需要对某些属性创建Getter和Setter方法,使用方法如下:
@Data
@ApiModel(description = "用户")
@TableName("admin")
public class Admin extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户名")
@TableField("username")
private String username;
@ApiModelProperty(value = "密码")
@TableField("password")
private String password;
@ApiModelProperty(value = "昵称")
@TableField("name")
private String name;
@ApiModelProperty(value = "手机")
@TableField("phone")
private String phone;
@ApiModelProperty(value = "仓库id")
@TableField("ware_id")
private Long wareId;
@ApiModelProperty(value = "角色名称")
@TableField(exist = false)
private String roleName;
}
2.@Slf4j注解
@Slf4j是一个日志打印的注解,在Spring运行过程中可以进行简单调试,判断程序运行的过程。
@Slf4j
public class ServiceAclApplication {
public static void main(String[] args) {
log.info("原神,启动!");
}
}
四、Lombok优势与缺点
1.优点:
能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
让代码变得简洁,不用过多的去关注相应的方法
属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
2.缺点:
不支持多种参数构造器的重载
虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度