Lombok插件安装及其使用
Lombok简介
Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,解决了的是在我们实体Bean中大量的Getter/Setter、toString、hashCode、slf4j等,某些时候需要重复编写的代码,在使用Lombok之后, lombok能够达到的效果就是在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法,这就是lombok的神奇作用。
lombok的官方地址:https://projectlombok.org/
lombok的Github地址:https://github.com/rzwitserloot/lombok
lombok的示例讲解:http://jnb.ociweb.com/jnb/jnbJan2010.html
lombok的安装(idea的安装方式)
在idea中打开 file–> settings–> Plugins–>搜索lombok,安装即可
如图所示:
lombok的使用方式、代码示例及其注意要点
添加依赖
<!-- 添加lombok依赖-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
@Getter and @Setter
: 自动生成Getter/Setter方法
不使用lombok:
package com.rp.lombok;
/**
* @author rp
*/
public class GetterSetterJavaExample {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
使用lombok:
package com.rp.lombok;
import lombok.Getter;
import lombok.Setter;
/**
* @author rp
*/
@Getter
@Setter
public class GetterSetterLombokExample {
private String name;
private int age;
}
@NonNull
:标识对象是否为空,为空则抛出异常
不使用lombok:
package com.rp.lombok;
import java.util.List;
/**
* @author rp
*/
public class NonNullJavaExample {
private List members;
public NonNullJavaExample( final List members) {
if (members == null){
throw new java.lang.NullPointerException("members");
}
this.members = members;
}
public List getMembers() {
return members;
}
public void setMembers( final List members) {
if (members == null){
throw new java.lang.NullPointerException("members");
}
this.members = members;
}
}
使用lombok:
package com.rp.lombok;
import lombok.*;
import java.util.Date;
import java.util.List;
/**
* @author rp
*/
public class NonNullLombokExample {
@Getter
@Setter
@NonNull
private List members;
}
@ToString
:覆盖tostring方法
不使用lombok:
package com.rp.lombok;
/**
* @author rp
*/
public class ToStringJavaExample {
private String name;
private int age;
@Override
public String toString() {
return "ToStringJavaExample{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
使用lombok:
package com.rp.lombok;
import lombok.ToString;
/**
* @author rp
* @ToString : 给ToStringLombokExample添加tostring方法;
*/
@ToString
public class ToStringLombokExample {
private String name;
private int age;
}
@EqualsAndHashCode
:覆盖equal和hashCode方法
不使用lombok:
package com.rp.lombok;
/**
* @author rp
*/
public class EqualsAndHashCodeJavaExample {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EqualsAndHashCodeJavaExample that = (EqualsAndHashCodeJavaExample) o;
if (age != that.age) return false;
return name != null ? name.equals(that.name) : that.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
使用lombok:
package com.rp.lombok;
import lombok.EqualsAndHashCode;
/**
* @author rp
*/
@EqualsAndHashCode
public class EqualsAndHashCodeLombokExample {
private String name;
private int age;
}
@Data
:自动为所有字段添加@ToString、@EqualsAndHashCode、@Getter方法,为非final字段添加@Setter 和 @RequiredArgsConstructor
不使用lombok:
package com.rp.lombok;
/**
* @author rp
*/
public class DateJavaExample {
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DateJavaExample that = (DateJavaExample) o;
if (age != that.age) return false;
return name != null ? name.equals(that.name) : that.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "DateJavaExample{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
使用lombok:
package com.rp.lombok;
import lombok.Data;
/**
* @author rp
*/
@Data
public class DateLombokExample {
private String name;
private int age;
}
@Cleanup
:自动帮我们调用close()方法
不使用lombok:
package com.rp.lombok;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* @author rp
*/
public class CleanupJavaExample {
public void testCleanUp(){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用lombok:
package com.rp.lombok;
import lombok.Cleanup;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* @author rp
*/
public class CleanupLombokExample {
public void testCleanUp(){
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Synchronized
: 序列化
不使用lombok:
package com.rp.lombok;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author rp
*/
public class SynchronizedJavaExample {
private final java.lang.Object $lock = new java.lang.Object[0];
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
public String synchronizedFormat(Date date) {
synchronized ($lock) {
return format.format(date);
}
}
}
使用lombok:
package com.rp.lombok;
import lombok.Synchronized;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author rp
*/
public class SynchronizedLombokExample {
private DateFormat format = new SimpleDateFormat("MM-dd-YYYY");
@Synchronized
public String synchronizedFormat(Date date) {
return format.format(date);
}
}
注意:如果您打算通过java的序列化机制长期存储它们,我们建议您始终在类中添加一个serialVersionUID。这样做,@Synchronized从方法中删除所有注释将不会破坏序列化。例如static final long serialVersionUID = 42L;
@SneakyThrows
: 抛出异常
不使用lombok:
package com.rp.lombok;
import java.io.UnsupportedEncodingException;
/**
* @author rp
*/
public class SneakyThrowsJavaExample {
/**
* 将byte数组转成字符串
* @param bytes
* @return
*/
public String getUtf8(byte[] bytes){
String result = "";
try {
result = new String(bytes,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
}
使用lombok:
package com.rp.lombok;
import lombok.SneakyThrows;
/**
* @author rp
*/
public class SneakyThrowsLombokExample {
/**
* 将byte数组转成字符串
* @param bytes
* @return
*/
@SneakyThrows
public String getUtf8(byte[] bytes){
String result = new String(bytes,"UTF-8");
return result;
}
}
@Slf4j
: 日志
不使用lombok:
package com.rp.lombok;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author rp
*/
public class Slf4jJavaExample {
public Logger logger = LoggerFactory.getLogger(Slf4jJavaExample.class);
public void testLogger(String name){
logger.info("测试Llf4j和@Slf4j-->{}",name);
}
}
使用lombok:
package com.rp.lombok;
import lombok.extern.slf4j.Slf4j;
/**
* @author rp
*/
@Slf4j
public class Slf4jLombokExample {
public void testLogger(String name){
log.info("测试Llf4j和@Slf4j-->{}",name);
}
}
注意: @slf4j 、@log 、@log4j2、@log4j 都是日志打印,不同点是提供日志的jar包底层实现不同。