1.为什么会有Lombok,解决了什么痛点
最近在学习spring boot的时候发现spring boot里面有推荐使用lombok,现在就写一下最近的学习心得。lombok让代码变得更加简洁,省去了一些繁琐的操作,比如设置get set方法,添加构造方法,打印日志等等。
2.给ide安装Lombok插件。
我这里选择的是idea.在idea的插件库中搜索Lombok,选择下载量最多的就可以了。
3.原理
首先是项目的源代码文件,在经过编译处理以后,lombok会使用自己的抽象语法树去进行注解的匹配,如果在项目中的某一个类中使用了lombok中的注解,那么注解编译器就会自动去匹配项目中的注解对应到在lombok语法树中的注解文件,并经过自动编译匹配来生成对应类中的getter或者setter方法,达到简化代码的目的。
4.如何使用
4.1加入依赖
org.projectlombok
lombok
1.16.18
provided
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");
}
}
总结
上述的注解可以配合使用。暂时我最常用的注解就是这些,后续如果还用到别的注解,再来更新。