欢迎大家来到IT世界,在知识的湖畔探索吧!
Hello 大家好,老闲来了。
最近这段时间项目周期节点卡的紧,出差忙着做项目的升级,一直没写文章,更久的是没有分享技术类文章了。一直以来,老闲也在断断续续的学习,看了一些系列的技术教程,有些非常棒的内容想写下来做分享,但是又担心老闲技术水平有限,如果分享的内容有误对大家会有影响。不过老闲之前说过很多次,学习输入有时候效果不是很好,而能够通过输出内容分享,倒逼提升输入的效果,这样对自己对他人都会有所帮助的,所以老闲还是会坚持分享一些技术文章,如果中间有任何的错误地方,还请读者朋友能够私信联系老闲,欢迎批评指正。今天翻看老闲的素材库,这个 lombok 的文章几个月前已准备好标题和大纲,一直没有完善内容,今天刚好项目上的阶段性的工作忙完了,索性就写了这篇文章。
1. 什么是 lombok
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
–https://projectlombok.org/
这个是 lombok 官网的介绍,大致意思就是说 lombok 是一个 java 库,开发人员使用 lombok 就不需要再写属性的 getter 或 equals 方法,使用一个注释就能使一个类具有一个功能齐全的构建器,还能够自动化日志记录变量等等。简而言之,就是通过使用 lombok ,会大大减少开发人员的工作量,想想如果一个类几十个属性,几十个 getter/setter 方法,虽然使用 IDE 有快捷键,但还是麻烦,并且如果后续这个类新增或者删除了一些属性,又需要补上一顿操作,但是使用了 lombok 后这些就不用改动了,这才是最爽的地方。下边两个图的比较,很明显看出使用了 lombok 后代码更简洁。
2. lombok的原理
Java5 中引入了注解这样的神器,通过注解和反射,我们可以在运行期(定义@Retention为RetentionPolicy.RUNTIME)获取注解值,但是这也会影响运行期的性能,如果我们想在编译期做些事情,注解和反射就不太好用了,而在 Java6 中引入了 JSR 269 API(Pluggable Annotation Processing API ),使得我们可以在 javac 编译期做一些操作,只要实现了 JSR 269 API 规范的程序,在编译期就能够得到调用, lombok 正是如此,因此使用 lombok 不会影响运行时的性能。
lombok 具体的实现原理是这样的,我们编写的源代码文件经过 javac 编译处理生成抽象语法树(AST),之后 lombok 会用自己的注解编译器去匹配项目中的注解,如果某个类上使用了 lombok 的相关注解,则 lombok 会找到该注解代码对应的语法树,并增加节点实现对应的操作, javac 根据新的语法树进行分析生成最终的字节码文件,这里的字节码文件已经是经过 lombok 处理过的具备新的功能的字节码文件。
3. lombok的使用
项目中如果要使用 lombok ,相关的依赖肯定是少不了的,使用 maven 构建工具的项目,需要在 pom 中加入 lombok 的依赖,如下:
<!– https://mvnrepository.com/artifact/org.projectlombok/lombok –><dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope></dependency>
使用其他的构建工具如 gradle 等可以去官网查看依赖方式,依赖导入之后需要在 IDE 中安装响应插件,要不然会大面积报错,老闲使用的 IDE 是 Intellij IDEA ,就以此为例,说明安装插件的方式。
打开 IDE 后,快捷键 Ctrl+Alt+S ,然后依次选择 Plugins –> Browse repositories ,在搜索框输入 lombok 进行搜索,在结果中选中 Lombok ,点击右侧的 Install(老闲的IDE中已经安装过了),等待安装完成,重启 IDE 就可以了,至于其他的 IDE 如何安装插件自行搜索。
插件安装好之后,看一下 lombok 中最常用的几个注解:
@Getter 注解和 @Setter 注解:这两个注解的作用,顾名思义就是为类中的属性生成 getter 和 setter 方法,加上这两个注解后,再也不用写 getter 和 setter 方法了,简直不要太爽。这两个注解可以加在具体的某个属性上边,这样只会给该属性生成 getter 和 setter 方法;
@NoArgsConstructor 注解和 @AllArgsConstructor 注解:在 JavaBean 或类 JavaBean 中使用,使用此注解会为类生成对应的无参和有参构造方法;
@EqualsAndHashCode 注解:在 JavaBean 或类 JavaBean 中使用,使用此注解会自动重写该类的 equals 方法和 hashCode 方法;
@ToString 注解:在 JavaBean 或类 JavaBean 中使用,使用此注解会自动重写对应的 toStirng 方法;
以上注解可以通过参数实现只对部分属性进行操作的需求,以 @ToString 注解为例,其他注解同 @ToString注 解:
@ToString(exclude=”column”)
意义:排除 column 列所对应的元素,即在生成 toString 方法时不包含 column 参数, exclude 的值可以是个集合,用以排除多个属性元素,写法为: @ToString(exclude={“column1″,”column2”})
@ToString(of=”column”)
意义:只生成包含 column 列所对应的元素的参数的 toString 方法,即在生成 toString 方法时只包含 column 参数,同样这个参数的值也可以是个集合,只生成包含多个 column 列所对应的元素的参数的 toString 方法:@ToString(of={“column1″,”column2”})
@Data 注解:实际开发中,某个 Bean 我们通常会需要 getter/setter ,toString , equals 和 hashCode ,加上上边的几个注解可以实现需要,但是更简单的是只用一个 @Data 注解即可满足我们的要求,它包含 Getter 、Setter 、 ToString 、 EqualsAndHashCode 、 RequiredArgsConstructor 注解;
@Slf4j 注解和 @Log4j 注解:在需要打印日志的类中使用,当项目中使用了 slf4j 或者 log4j 打印日志框架时使用这两个注解,会简化日志的打印流程;
@Value 注解:用在类上,是 @Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter 方法,而不提供 setter 方法;
@NonNull 注解:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE 异常;
@Accessors 注解:这个注解有三个参数, chain 、 fluent 、 prefix ,这三个参数都是布尔值,常用的是 @Accessors(chain = true) ,加上这个参数并赋予为真的值后, setter 方法返回的是当前对象,所以之后的为属性 set 值的时候可以这么链式调用书写了:
User user = new User().setId(1).setName(“name”)……;
以上,是 lombok 的简单介绍,如果有想进一步了解的可以去官网 https://www.projectlombok.org/ 深入研究。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/35659.html