Lombok这把利器你值得拥有

问题和背景

每次你在写Java Bean的时候是不是都得写上一堆的Get Set方法,如果属性较多的话,这个Java Bean就会变的很长,虽然IDE可以帮助我们生成这些东西,但是这种体验依然不爽。
我只是想写个Bean,一下子给我搞出来这么多代码,把我的关注点全都整没了,真是让人烦躁。

看看下面这团代码你觉得烦不烦

package test;
public class Test {
    
    
  private String id;
  private String name;
  private String age;
  private String gender;
  private String address;
  private String email;
  private String qq;
  private String phone;

  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;
  }

  public String getGender() {
    
    
    return gender;
  }

  public void setGender(String gender) {
    
    
    this.gender = gender;
  }

  public String getAddress() {
    
    
    return address;
  }

  public void setAddress(String address) {
    
    
    this.address = address;
  }

  public String getEmail() {
    
    
    return email;
  }

  public void setEmail(String email) {
    
    
    this.email = email;
  }

  public String getQq() {
    
    
    return qq;
  }

  public void setQq(String qq) {
    
    
    this.qq = qq;
  }

  public String getPhone() {
    
    
    return phone;
  }

  public void setPhone(String phone) {
    
    
    this.phone = phone;
  }
}

利器出鞘,谁与争锋

苍天有眼, 终于有人看不下去了,下面有请我们的主角隆重登场。
图片
这个主角就是lombok, 他的出现让我彻底欲罢不能,彻底放弃了以前的做法。
上边那个例子,只需要在类上加上一个@Data注解即可达到同样的效果。

@Data
public class Test {
    
    
  private String id;
  private String name;
  private String age;
  private String gender;
  private String address;
  private String email;
  private String qq;
  private String phone;
}

代码量从76 行直接变成了11行,而且代码更加清晰明了,一目了然。
图片

探索Lombok更多功能

什么如果你觉得Lombok就只是帮助我们生成Get Set那你就too young too naive 了,我们一块来看看Lombok还是有哪些值得我们兴奋的特性吧。

你想要包含所有参数的构造方法? 没问题,安排

以前我们这么写

package test;

import lombok.Data;

@Data
public class Test {
    
    
  private String id;
  private String name;
  private String age;
  private String gender;
  private String address;
  private String email;
  private String qq;
  private String phone;

  public Test(String id, String name, String age, String gender, String address, String email, String qq,
      String phone) {
    
    
    super();
    this.id = id;
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.address = address;
    this.email = email;
    this.qq = qq;
    this.phone = phone;
  }
}

你还需要一个无参数的构造方法? 没问题,安排上

以前我们这么写

package test;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class Test {
    
    
  private String id;
  private String name;
  private String age;
  private String gender;
  private String address;
  private String email;
  private String qq;
  private String phone;

}

再来一个,让你彻底爱上它

我们以前使用日志框架,一般是先在类上定义一个私有的logger对象,然后用Factory 调用静态的getLogger方法来给logger对象赋值

package test;

public class Logger {
    
    
//每次都得搞这么一句话,十分不爽
  private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Logger.class);

  public static void main(String[] args) {
    
    
    try {
    
    
      int a = 1 / 0;
    } catch (Exception e) {
    
    
      log.error(e.getMessage());
    }
  }

}

有了lombok后我们可以跟他说拜拜了,一个注解@Slf4j 全搞定

package test;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Logger {
    
    
  public static void main(String[] args) {
    
    
    try {
    
    
      int a = 1 / 0;
    } catch (Exception e) {
    
    
    //这个log 变量我们可以不声明就用哦
      log.error(e.getMessage());
    }
  }

这里我只列举几个常用的注解,更多的功能需要你自己去官网探索哦。

Lombok引入工程

引入lombok的依赖

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

Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件,所以lombok不会对程序性能带来任何的损失。那些说Lombok是通过反射获取xx信息,从而带来性能下降的说法简直是荒谬。

添加IDE对lombok的支持(IDEA为例)

点击File-- Settings设置界面,安装Lombok插件

在这里插入图片描述
点击File-- Settings设置界面,开启 AnnocationProcessors:

在这里插入图片描述
开启该项是为了让Lombok注解在编译阶段起到作用。

Lombok实现原理

自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:

  1. javac对源代码进行分析,生成一棵抽象语法树(AST)
  2. javac编译过程中调用实现了JSR 269的Lombok程序
  3. 此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树 (AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点
  4. javac使用修改后的抽象语法树(AST)生成字节码文件

猜你喜欢

转载自blog.csdn.net/CSDN_java1005/article/details/115001786