在传统方法中,我们对一个实体类定义了属性之后,会手动生成set,get方法。使用lombok插件可以简化繁琐的代码。但是在大型项目中性能不太好,因为它要去字节码文件中进行修改,所以在一个大项目中修改代码工作量比较大。
原理:在编译的时候修改字节码文件,底层使用字节码技术,帮我们在内存中修改字节码文件,生成get,set方法。
使用lombok,需要先使eclipse支持该插件,先要下载jar(Download),下载完成后双击jar,选择本机上的eclipse,点击Install,重启eclipse。
然后在springboot中集成lombok插件,在pom文件中添加依赖:
org.projectlombok
lombok
编写实体类:
package wyh.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@Slf4j//使用日志,等同于private static final Logger logger = LoggerFactory.getLogger(JspController.class);
public class User {
//在每一个属性上面都加上set,get注解,在后面使用对象的时候就可以直接调用对象的set,get方法
@Getter
@Setter
private String name;
@Getter
@Setter
private Integer age;
public static void main(String[] args) {
User user = new User();
user.setAge(11);
user.setName("wyh");
log.info(user.toString());
}
@Override
public String toString() {
return "userName:"+name+"age:"+age;
}
}
我们可以发现在使用了lombok插件后,不需要手动生成set,get方法就可以在使用对象时直接调用set,get方法。
运行该实体类中的main方法,查看打印结果,使用@Slf4j就可以打印出日志:
那么问题来了,如果一个实体类中有很多属性,岂不是要写很多个@Setter,@Getter注解吗?
这样就有了更进一步的使用,我们可以在类上面添加@Setter,@Getter,这样整个类中的属性都可以自动有了set,get方法。
当然,lombok还有很多注解可以帮助我们简化代码:
@ToString:自动生成toString().
@Data:相当于set+get+tostring@RequiredArgsConstrutor+@RequiredArgsConstrutor
下面我们来验证一下lombok到底帮我们做了什么:
在项目中target---->
找到class文件:
将该class文件拖入反编译工具中我们可以发现它其实就是帮我们生成了和我们之前手动编写set,get方法一样的代码:
现在我们可以对比一下两份代码:
源文件:
package wyh.entity;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
@Slf4j//使用日志,等同于private static final Logger logger = LoggerFactory.getLogger(JspController.class);
/*@Getter
@Setter
@ToString*/
@Data
public class User {
//在每一个属性上面都加上set,get注解,在后面使用对象的时候就可以直接调用对象的set,get方法
private String name;
private Integer age;
public static void main(String[] args) {
User user = new User();
user.setAge(11);
user.setName("wyh");
log.info(user.toString());
}
/*@Override
public String toString() {
return "userName:"+name+"age:"+age;
}
*/
}
反编译:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: User.java
package wyh.entity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class User
{
private static final Logger log = LoggerFactory.getLogger(wyh/entity/User);
private String name;
private Integer age;
public static void main(String args[])
{
User user = new User();
user.setAge(Integer.valueOf(11));
user.setName("wyh");
log.info(user.toString());
}
public String getName()
{
return name;
}
public Integer getAge()
{
return age;
}
public void setName(String name)
{
this.name = name;
}
public void setAge(Integer age)
{
this.age = age;
}
public boolean equals(Object o)
{
if (o == this)
return true;
if (!(o instanceof User))
return false;
User other = (User)o;
if (!other.canEqual(this))
return false;
Object this$name = getName();
Object other$name = other.getName();
if (this$name != null ? !this$name.equals(other$name) : other$name != null)
return false;
Object this$age = getAge();
Object other$age = other.getAge();
return this$age != null ? this$age.equals(other$age) : other$age == null;
}
protected boolean canEqual(Object other)
{
return other instanceof User;
}
public int hashCode()
{
int PRIME = 59;
int result = 1;
Object $name = getName();
result = result * 59 + ($name != null ? $name.hashCode() : 43);
Object $age = getAge();
result = result * 59 + ($age != null ? $age.hashCode() : 43);
return result;
}
public String toString()
{
return (new StringBuilder("User(name=")).append(getName()).append(", age=").append(getAge()).append(")").toString();
}
public User()
{
}
}