lombok原理、springboot中安装使用

背景

在面向对象编程中最常用的就是去编写一些对象类,然后定义对象的一些Get/Set、toString、hashcode等方法,还有无参全参的构造函数等等,虽然编译器会给我们自动生成,但是总是感觉代码过于冗余,而且当我们修改对象的某个属性的时候,需要去找到对应的get,set,toString方法等,然后依次修改,这样确实很麻烦。那么是否一款插件或工具能够自动地实现这个方法呢?本文将向大家介绍一款在主流的开发环境中都可以使用的Java开发工具,以及其背后自定义注解的原理。

Lombok的简介

Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。

IDEA下Lombok插件的安装使用

首先大家先去在喜好里找到Plugins,然后在商店搜索lombok,然后安装,也可以去官网下载lombok的jar包,然后导入进去,以下是安装成功之后的样子。
在这里插入图片描述
然后我们添加lombok的pom依赖

<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
</dependency>

接着就可以使用lombok来简化我们的代码了

lombok常用注解介绍

  • @EqualsAndHashCode:实现equals()方法和hashCode()方法

  • @ToString:实现toString()方法

  • @Data :注解在类上;是一个混合注解,包含所有属性的 getting 、 setting
    、equals、canEqual、hashCode、toString 方法

  • @Setter:注解在属性上;为属性提供setting 方法

  • @Getter:注解在属性上;为属性提供 getting 方法

  • @Log4j :注解在类上;为类提供一个属性名为log 的 log4j 日志对象

  • @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法

  • @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

  • @Cleanup:关闭流

  • @Synchronized:对象同步 @SneakyThrows:抛出异常

lombok使用示例

未使用lombok的Person类
public class Person {
    //id
    private String id;
    //姓名
    private String name;
    //性别
    private String age;

    private Logger log = Logger.getLogger(Person.class);

    public Person(String id, String name, String age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }


    public Person() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return Objects.equals(id, person.id) &&
                Objects.equals(name, person.name) &&
                Objects.equals(age, person.age);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

这里我们只简单地定义了三个字段,代码量就已经很繁琐很冗余了

使用lombok修改Person类之后
import lombok.*;
import lombok.extern.log4j.Log4j;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Log4j
@EqualsAndHashCode
@Builder
public class Person {
    //id
    private String id;
    //姓名
    private String name;
    //性别
    private String age;
}

What?就这么点代码就可以了吗?现在的你肯定会去对照两处代码,总觉得会漏掉什么方法,但是检查过后发现,不仅没有少方法,还多出一个注解@Builder,那么这个注解有什么用呢?

@Builder

虽然类已经存在了无参全参的构造方法,但是在实际的业务开发中,不可能做到一次性将属性在同一地方全部赋值,有可能只需要将某几个属性赋值,比如这里我们只给name,age赋值,id我们交给Mybatis自动生成UUID,我想大家会这样写:

Person person = new Person();
person.setName("哼哼");
person.setAge("18");

这样看起来也不是很复杂,但字段多了代码量还是会线性增多。
当我们用了@Builder关键字之后

Person person = Person.builder().name("哼哼").age("18").build();

用build的形式就能更快更简便地创建对象啦,是不是很方便!
Unbeilievable!!!
incredible!!!

lombok背后原理

Lombok这款插件是通过
可插件化的Java自定义注解处理API( Pluggable Annotation Processing API)
来实现在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后,生成真正在JVM上面执行的“Class文件”
解释一下
Annotation Processor:注解处理

Annotation Processor是javac的一个工具,它用来在编译时扫描和处理注解。
通过Annotation Processor可以获取到注解和被注解对象的相关信息,然后根据注解自动生成Java代码,省去了手动编写,提高了编码效率。

在这里插入图片描述
从上图可知在java代码转为class文件时,通过Annotation Processor对java代码进行处理,通过注解的方式来添加了需要的代码。其中Lombok插件具体的执行流程如下:

在这里插入图片描述
从上面的Lombok执行的流程图中可以看出,在Javac 解析成AST抽象语法树之后, Lombok 根据自己编写的注解处理器,动态地修改 AST,增加新的节点(即Lombok自定义注解所需要生成的代码),最终通过分析生成JVM可执行的字节码Class文件。使用Annotation Processing自定义注解是在编译阶段进行修改,而JDK的反射技术是在运行时动态修改,两者相比,反射虽然更加灵活一些但是带来的性能损耗更加大。

总结

这里我们简单介绍了一下从平时bean代码冗余繁琐的问题,以至于出现lombok,然后了解了lombok在IDEA上的简单安装使用,常用的注解。并举个例子感受到了lombok的魅力所在,然后大致了解了lombok背后的原理,是通过 Annotation Processing 自定义注解处理,在java文件转为class文件的时候进行了新代码的添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值