Lombok是什么

1.为什么会有Lombok,解决了什么痛点

最近在学习spring boot的时候发现spring boot里面有推荐使用lombok,现在就写一下最近的学习心得。lombok让代码变得更加简洁,省去了一些繁琐的操作,比如设置get set方法,添加构造方法,打印日志等等。

2.给ide安装Lombok插件。

我这里选择的是idea.在idea的插件库中搜索Lombok,选择下载量最多的就可以了。


lombok插件.png

3.原理

首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。

4.如何使用

4.1加入依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>

4.2 @Data

注解在类上,自动生成了get set方法,还有equals,hashCode, toString等方法, 下载完成以后重启idea就可以了。

编译前

package com.xuzhang.springboot.jpa.model;

import lombok.Data;

@Data
public class User {
    private String name;
}

编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.xuzhang.springboot.jpa.model;

public class User {
    private String name;

    public User() {
    }

    public String getName() {
        return this.name;
    }

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

    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof User)) {
            return false;
        } else {
            User other = (User)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$name = this.getName();
                Object other$name = other.getName();
                if (this$name == null) {
                    if (other$name != null) {
                        return false;
                    }
                } else if (!this$name.equals(other$name)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(Object other) {
        return other instanceof User;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $name = this.getName();
        int result = result * 59 + ($name == null ? 43 : $name.hashCode());
        return result;
    }

    public String toString() {
        return "User(name=" + this.getName() + ")";
    }
}

4.3 @AllArgsConstructor

提供所有参数的构造方法,不提供默认的无餐构造方法。

编译前

package com.xuzhang.springboot.jpa.model;

import lombok.AllArgsConstructor;

@AllArgsConstructor
public class User {
    private String name;
    private int age;
}

编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.xuzhang.springboot.jpa.model;

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

4.4 @NoArgsConstructor

上面说了@AllArgsConstructor会提供所有参数的构造方法,但不提供默认无参数的构造方法,所以就可以用到了@NoArgsConstructor

编译前:

package com.xuzhang.springboot.jpa.model;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
}

编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.xuzhang.springboot.jpa.model;

public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }
}

4.5 @Slf4j

编译前

package com.xuzhang.springboot.jpa.model;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class User {
    private String name;
    private int age;

    private void test(){
        log.info("test");
    }
}

编译后:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.xuzhang.springboot.jpa.model;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class User {
    private static final Logger log = LoggerFactory.getLogger(User.class);
    private String name;
    private int age;

    public User() {
    }

    private void test() {
        log.info("test");
    }
}

总结

上述的注解可以配合使用。暂时我最常用的注解就是这些,后续如果还用到别的注解,再来更新。