Spring boot Lombok
发布日期:2021-05-10 09:25:33 浏览次数:25 分类:精选文章

本文共 6038 字,大约阅读时间需要 20 分钟。

文章目录

Spring boot Lombok

上一节 Spring boot 参数校验

源码


简介

lombok 并不是spring 或者springboot的 ;这里写这一章节主要是为了后续代码中会经常用到,所以在此简单介绍和使用下。

lombok 是为了简化代码开发, 避免编写相对不太注重的代码,例如get set等;让代码更简洁;

不过 lombok 也有很大的争议,不过使用上很简单,学习也不费劲。看自己是否需求选择使用。

idea 安装

直接在 设置中搜索 lombok安装重启即可

在这里插入图片描述

eclipse 安装

使用添加依赖

依赖

version 在springboot 2.x版本后可以不写,springboot 也管理了他的版本

org.projectlombok
lombok

常用注解

注解 说明 备注
@UtilityClass 标注在类上,类会标记为final,生成一个私有构造器,该类中的所有方法,内部类,以及字段都会标记为静态 工具类标注
@Slf4j 标注在类上,可以使用log 进行日志输出,同理还有@Log4j ,@log4j2 等支持不同的日志框架 日志打印
@Data 标注了 @Data的类,会生成getter ,setter, 方法以及无参构造器,全部参数构造器, tostring方法,equal和 hashCode方法 实体bean的常用方法
@Getter 修饰类或者字段,生成getter方法 getter
@Setter 修饰类或者字段,生成setter方法 setter
@Accessors 修饰类或者字段,配置@setter或者@Data使用,并且可定制化方法的前缀,以及chain=true设置为链调用 当链式调用set方法的时候比较适用
@EqualsAndHashCode 修饰类,生成equals 和hashcode方法
@AllArgsConstructor 修饰类,生成所有参构造器
@NoArgsConstructor 修饰类,生成无参构造器
@RequiredArgsConstructor 修饰类, 生成无参和所有参构造器
@ToString 修饰类,生成tostring 方法
@NonNull 检测参数是否为空,抛出NullPointerException null校验
@Cleanup 修饰局部变量,清除资源,默认调用资源的close方法 清除资源使用
@SneakyThrows 修饰方法,抛出异常
@Synchronized 修饰方法,方法会自动被synchronized修饰 用处不大
@val 修饰局部变量,变量会变成不可从新赋值,和final作用一致
@var 修饰局部变量,例如 var a = 10 ;可以自动类型推断 java11 已经实现

常用示例

@UtilityClass 和 @Slf4j 的使用

@UtitityClass 修饰类,表示这是一个工具类

@Slf4j 修饰类;表示可以使用Slf4j的日志输出,不用在代码中写 loggerFactory.getLogger… 的模板代码了

@UtilityClass@Slf4jpublic class StringUtil {       public int length(String str) {           log.info("str length ");        return str.length();    }}

对比生成的class

对比下, 类被final 修饰,方法变为static; 并且生成私有构造器; @Slf4j 也生成了log

public final class StringUtil {       private static final Logger log = LoggerFactory.getLogger(StringUtil.class);    public static int length(String str) {           log.info("str length ");        return str.length();    }    private StringUtil() {           throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");    }}

@Accessors

@Accessors(chain = true) // 通过chain=true,生成链式set调用@Setterpublic class AccessorsTest {       private String name;    private Date createTime;}

class

setter方法会返回this 当前对象;这样就可以 obj.setx().sety()…;链式setter

public class AccessorsTest {       private String name;    private Date createTime;    public AccessorsTest() {       }    public AccessorsTest setName(final String name) {           this.name = name;        return this;    }    public AccessorsTest setCreateTime(final Date createTime) {           this.createTime = createTime;        return this;    }}

@NonNull

参数null 校验

@Slf4j@Setterpublic class NonNullTest {    // 修饰字段,生成的setter方法会进行null校验    @NonNull    private String str;    // 修饰构造器    public NonNullTest(@NonNull String str) {       }   // 修饰普通方法    public  String upperCase(@NonNull String str) {           return str.toUpperCase();    }   // 修饰静态方法    public static String upperCase2(@NonNull String str) {           return str.toUpperCase();    }}

class

会进行字段或者参数是否为空的判断

public class NonNullTest {       private static final Logger log = LoggerFactory.getLogger(NonNullTest.class);    @NonNull    private String str;    public NonNullTest(@NonNull String str) {           if (str == null) {               throw new NullPointerException("str is marked non-null but is null");        }    }    public String upperCase(@NonNull String str) {           if (str == null) {               throw new NullPointerException("str is marked non-null but is null");        } else {               return str.toUpperCase();        }    }    public static String upperCase2(@NonNull String str) {           if (str == null) {               throw new NullPointerException("str is marked non-null but is null");        } else {               return str.toUpperCase();        }    }    public void setStr(@NonNull final String str) {           if (str == null) {               throw new NullPointerException("str is marked non-null but is null");        } else {               this.str = str;        }    }}

@Cleanup @SneakyThrows

@SneakyThrows 抛出异常,简化了我们在方法上throws exception;作用不是很大,还是手动试用感觉异常清晰明了

@Cleanup清除资源;例如 调用 io的close 方法释放资源

@SneakyThrows    public static void readFile(File file)  {           @Cleanup FileInputStream fileInputStream = new FileInputStream(file);    }

class

public static void readFile(File file) {           try {               FileInputStream fileInputStream = new FileInputStream(file);            if (Collections.singletonList(fileInputStream).get(0) != null) {                   fileInputStream.close();            }        } catch (Throwable var2) {               throw var2;        }    }

不过jdk7 以后多使用 try-with-resource模式

try (FileInputStream fileInputStream = new FileInputStream(file)) {           }

@val @var

public void varTest() {           var a = 1; // 声明为局部变量,可以自动类型推断        var b = 2;        System.out.println(a + b);    }    public void valTest() {           val str = "aaa"; // 声明为常量        //str = "Bbb"; // 再次赋值的时候,编译不过去    }

getter,setter 使用问题;这个在开发中是很常见的一种错误,建议多看看

getter,setter 使用

@Getter@Setterpublic class GetSetTest {    // 第一个字母小写,第二个字母大写,    //我们不使用lombaok,按照java规范生成的get,set    //( 如果属性名的第一个字母是小写且第二个字母大写,那么该属性名直接用作     // getter/setter 方法中 get/set 的后部分,就是说大小写不变。例如属性名为uId,方法是getuId,setuId    private String uId;    // 前两个或者多个字符是小写(驼峰规范); 生成的getset 为属性第一个字母    //变大写,例如 name, getName, setName    private String name;    private Integer myAge;    public String getuId() {           return uId;    }    public void setuId(String uId) {           this.uId = uId;    }    public String getName() {           return name;    }    public void setName(String name) {           this.name = name;    }    public Integer getMyAge() {           return myAge;    }    public void setMyAge(Integer myAge) {           this.myAge = myAge;    }}

我们使用lombok生成

...    public String getUId() {           return this.uId;    }        public void setUId(final String uId) {           this.uId = uId;    }

如果第一个字母是小写,第二个字母是大写,lombok和 java生成的getset方法是不一样的;基于这一点spring 或者其他框架, 在给属性赋值的时候会出现问题

以上就是Lombok的简单运用和 一些问题;是一个辅助我们开发简洁的工具。


下一节 Spring boot jdbcTemplate

上一篇:Spring boot jdbcTemplate
下一篇:Spring boot 异常配置

发表评论

最新留言

很好
[***.229.124.182]2025年04月01日 15时59分45秒