之前对lombok的使用和了解就是@Data和对应的部分功能属性@Setter和@Getter,帮着我们不在自己手动创建setter代码和getter代码。但是最近去看源码发现lombok作用并不是那么单一。举个例子我们经常用的@Log和@Slf4j这两个常用的日志注解也是lombok的,而且spring官方和IDEA官方也是十分推荐使用lombok,那这个lombok具体是干什么的,都有什么功能,就很值得学习研究了。
一 lombok是什么和原理
官方解释
Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。
说人话,就是我们平时在操作POJO实际上有很多重复或者比较繁琐的环节,lombok帮你解决这些问题,通过注解让代码更简洁,更专注功能的开发的一个工具包。
lombok实现大致原理
首先代码编译会生成对应的一个语法树,这个语法树实际上可以通过插入式注解器处理添加上你想添加的东西,如果中间没有别的注解器再来修改,就会生成对应的字节码class文件(相当于注解在过程中给你添加新的东西到class文件中)
二 lombok经常使用的注解
这里有一个网址是关于lombok的api解释的链接,可以看一下:
Reducing Boilerplate Code with Project Lombok
(一)@Data @Setter @Getter
实际这几个功能其实都是指的是我们平常使用pojo免不了会对里面的属性写他们的getter方法和setter方法。
利用上面可以分别生成get方法和set方法,set方法,get方法。
(二)@Log @Log4j @Slf4j以及一大堆支持的log注解
实际上我们代码过程中经常会写关于创建日志的语句类似于下面的
private Logger logger = LoggerFactory.getLogger(XXXX.class);
实际上lombok在这方面也帮你想到了,直接用注解省掉中间这一步,比如我们平时经常用的就是@slf4j
(三)@ToString
这个有点意思,实际就是给你这个pojo新建的bean里面赋值,比如说你创建了一个对象
@Getter
@Setter
@ToString
public class Student {
private String name;
private int age;
}
左右就是创建一个Student,里面name和age是什么,@ToString会自动帮你以字符串的形式赋值,你就知道这个bean里面只是什么可以打印出来:
还有类似的是的@EqualsAndHashCode他还可以帮你实现对应的equal方法,和生成和hash值。
callSuper = false 就是不会用到父类的属性,callSuper = true就是你父类的属性值也会参与进来。
三 lombok的缺点
lombo的很多东西都是为我们省事,直接通过注解的形式,让我们代码更简洁,那他有没有坏处呢?当然有。
就是简洁性提高,但是代码阅读的门槛的机会提升,一个连lombok是啥的人都不知道,看你代码一大堆注解肯定是有很多问号。
问题排查难度,实际你可以认为是lombok给你封装了一个脚手架,但是有的时候出问题不是你的代码可能是lombok本身或者你设置的问题,排查难度会加大,除了考虑自己的代码,还要考虑框架工具包的问题。
还有大家常说的“强奸队友”,就是项目组一个人安装了lombok,大家都要安装,否则项目报错,没法合作开发。