Lombok

目标

  • 什么是Lombok
  • Lombok的原理
  • Lombok的常用注解
  • Lombok的安装
  • 官网:https://projectlombok.org/

在这里插入图片描述

什么是Lombok

官网介绍:

​ Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

​ Project Lombok是一个java库,它可以自动插入编辑器和构建工具,增强java性能。永远不要再编写另一个getter或equals方法,只要有一个注释,您的类就有一个功能齐全的生成器,自动记录变量等等。

Lombok原理

​ Java规范:JSR 269(Java Specification Requests)插件化注解处理API(Pluggable Annotation Processing API)

​ JDK6提供的特性,在 Javac编译期(SOURCE标识)利用注解,在字节码文件中生成get、set等方法

Java编译器执行过程:

在这里插入图片描述

安装Lombok

1️⃣在Maven中加入依赖

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

2️⃣在IDEA安装插件

File–>Settings–>Plugins(插件)–>Marketplace–>搜索Lombok–>Install–>Apply–>重启IDEA

在这里插入图片描述

2️⃣开启Enable annotation processing

  • 安装后会弹出

在这里插入图片描述

  • 如果没有弹出,则安装下面配置。

在这里插入图片描述

使用Lombok

引入依赖

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


<!-- 或者Spring -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

使用提供注解

@Getter/@Setter

  1. 为单个成员变量提供get/set方法
  2. 为所有成员变量设置get/set方法
  3. 无法为static设置get/set方法,只为final类型设置get方法

1️⃣为单个成员变量提供get/set方法

在这里插入图片描述

2️⃣为所有成员变量设置get/set方法

  • 使用AccessLevel枚举类设置生成的Get/Set方法的访问权限。
    • AccessLevel.PUBLIC:公开【默认
    • AccessLevel.MODULE:默认【不写修饰符】
    • AccessLevel.PROTECTED:受保护的
    • AccessLevel.PACKAGE:包【该包及其子包】
    • AccessLevel.PRIVATE:私有的
    • AccessLevel.NONE:不生成响应方法

在这里插入图片描述

3️⃣无法为static设置get/set方法,只为final类型设置get方法

在这里插入图片描述

@ToString

​ ToString只能加在类上,自动生成toString方法,可以使用exclude排除多个字段,of必须包含哪些字段。

  • 例:User
    • 使用exclude = {“bir”},排除了bir
    • 使用of = {“id”, “name”},必须包含id和name
    • 输出结果:User(id=null, name=null),未含有age

在这里插入图片描述

@EqualsAndHashCode

​ 生成equals方法、canEqual(判断是否属于Car类)、hashCode方法。也可以进行相等比较的排除,指定。

@EqualsAndHashCode(exclude = {"字段1","字段2"},of = {"字段1","字段2"})

@NonNull

可以加在成员变量前,也可以加在方法参数前。用来指定某个字段不能为空。

@NonNull
private String id;

构造器注解

  • @NoArgsConstructor:生成没有参数的构造器
  • @RequiredArgsConstructor:为需要特殊处理的每个字段生成一个带有1个参数的构造函数
  • @AllArgsConstructor:为类中的每个字段生成一个带有1个参数的构造函数

@Data

@Data集合了@Getter、@Setter、@ToString、@EqualsAndHashCode、@NoArgsConstructor

  • User类中只有id属性,@Data注解生成了无参构造器、equals、get/set方法、hashCode、toString

在这里插入图片描述

@Accessors

​ 使用在类上,用来给类中set方法开启链式调用。chain属性用来指定是否开启set方法链式调用,true开启,false关闭。

  • User类
@Data
@Accessors(chain = true)
public class User {
    private Integer id;
    private String name;
    private Double salary;
}
  • 编译后生成的User类(部分)
public User setId(final Integer id) {
    this.id = id;
    return this;
}

public User setName(final String name) {
    this.name = name;
    return this;
}

@Slf4j

在类上使用,快速给类定义一个日志变量。

原理:使用@Slf4j注解,相当于在类中声明一个日志对象。

  • 例:
@Slf4j
@RestController
public class UserController {

    @RequestMapping("/findAll")
    public String findAll(){
        log.info("a");
        return "findAll";
    }
}
  • 编译后的类
@RestController
public class UserController {
    private static final Logger log = LoggerFactory.getLogger(UserController.class);

    public UserController() {
    }

    @RequestMapping({"/findAll"})
    public String findAll() {
        log.info("a");
        return "findAll";
    }
}

😆使用

// void info(String var1, Object var2);
log.info("进入{}地方","北京");

@Log

支持Log4j、Slf4j,日志功能,在类上使用,快速给类定义一个日志变量。

原理:使用@Log注解,相当于在类中声明一个日志对象。

private static final Logger log = Logger.getLogger(UserController.class.getName());

@Builder

使用此注解进行对象的构建,函数式编程/链式编程,省去逐行字段set。

原理:@Builder在编译过程中会生成Builder静态内部类,然后会封装被注解类的所有属性。调用builder()方法后返回类型,就是被重新封装的Builder类,再调用build()方法,则会new原类对象将所有属性传入然后返回。

  • User类
@Builder
public class User {
    private Integer id;
    private String name;
}
  • 使用
@Test
public void test(){
    User user = User.builder().id(1).name("小王").build();
}
  • 编译后的User类
public class User {
    private Integer id;
    private String name;

    User(final Integer id, final String name) {
        this.id = id;
        this.name = name;
    }

    public static UserBuilder builder() {
        return new UserBuilder();
    }

    public static class UserBuilder {
        private Integer id;
        private String name;

        UserBuilder() {
        }

        public UserBuilder id(final Integer id) {
            this.id = id;
            return this;
        }

        public UserBuilder name(final String name) {
            this.name = name;
            return this;
        }

        public User build() {
            return new User(this.id, this.name);
        }

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

val

类似于JS中的val(弱引用类型),在编译阶段确定类型,简化操作。

// java代码
val map = new HashMap<String,String>();
//编译后
HashMap<String, String> map = new HashMap();

@Cleanup

此注解已被JDK1.7新特性 自动资源管理所替代。

位置:可直接写在方法内

作用:对资源流进行清理

原理:自动生成了try-finally结果,finally内判断了是否产生了异常。

  • 编译前
 public String findAll(HttpServletResponse response) throws IOException {
    @Cleanup
    ServletOutputStream outputStream = response.getOutputStream();
    return "findAll";
}
  • 编译后
public String findAll(HttpServletResponse response) throws IOException {
    ServletOutputStream outputStream = response.getOutputStream();

    String var4;
    try {
        var4 = "findAll";
    } finally {
        if (Collections.singletonList(outputStream).get(0) != null) {
			outputStream.close();
        }
    }

    return var4;
}

//无返回值编译后的结果
public void findAll(HttpServletResponse response) throws IOException {
    ServletOutputStream outputStream = response.getOutputStream();
    if (Collections.singletonList(outputStream).get(0) != null) {
        outputStream.close();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值