SpringBoot第三天 - Lombok
SpringBoot - Lombok
1. 简介
官方介绍:
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.
Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注解实现这一目的。
那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦,它能够在我们编译源码的时候自动帮我们生成这些方法。
lombok能够达到的效果就是在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法,这就是lombok的神奇作用。
虽然有人可能会说IDE里面都自带自动生成这些方法的功能,但是使用lombok会使你的代码看起来更加简洁,写起来也更加方便。
2. 安装
2.1 Maven依赖
pom.xml:
<!-- 使用SpringBoot框架的依赖管理功能 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.2 使用IntelliJ IDEA开发需要Lombok插件
使用IntelliJ IDEA作为IDE开发时需要安装Lombok插件(IDEA 2020.3+版本已经自带Lombok插件),
同时设置 Setting -> Compiler -> Annotation Processors -> Enable annotation processing勾选。
3. 常用注解
3.1 @Getter & @Setter
3.1.1 作用
自动生成属性字段的get和set方法。
3.1.2 作用范围
- 类或接口(ElementType.TYPE);
当注解在类上时,会按照注解的配置为所有字段生成方法。 - 字段,枚举常量(ElementType.FIELD)。
当注解在字段上时,会按照注解的配置为此字段生成方法。
3.1.3 属性
- lombok.AccessLevel value:指定get或set方法的访问修饰符;
- boolean lazy:是否启用懒加载;
对象初始化时,该字段并不会真正初始化,而是第一次访问该字段时才进行初始化字段的操作。 - AnyAnnotation[] onMethod:指定生成get和set方法时需要添加的注解。
3.2 @ToString
3.2.1 作用
自动生成重写的toString方法,打印所有字段。
3.2.2 作用范围
- 类或接口(ElementType.TYPE)
3.2.3 属性
- boolean includeFieldNames:是否打印字段名称;
默认为true,即toString方法也打印字段的名称。 - String[] exclude:指定不打印的字段;
指定哪些字段不打印。
3.3 @EqualsAndHashCode
3.3.1 作用
自动生成重写的equal方法和hashCode方法。
3.3.2 作用范围
- 类或接口(ElementType.TYPE)
3.3.3 属性
- String[] exclude:指定不使用的字段。
指定哪些字段不使用。
3.4 @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor
3.4.1 作用
@NoArgsConstructor生成无参构造方法;
@AllArgsConstructor生成全参构造方法;
@RequiredArgsConstructor仅对带有final修饰的字段生成构造方法。
3.4.2 作用范围
- 类或接口(ElementType.TYPE)
3.4.3 属性
- String staticName:指定静态构造方法的名称;
如果指定此名称,生成的构造方法会被private修饰,lombok会生成一个该名称的静态的模拟构造方法来替代生成的默认构造方法。 - AnyAnnotation[] onConstructor:指定生成的构造方法需要添加的注解;
- AccessLevel access:指定生成的构造方法的访问修饰符。
3.5 @Data
3.5.1 作用
整合注解,加上@Data注解相当于加了以**解:
- @Getter & @Setter
- @ToString
- @EqualAndHashCode
- @RequiredArgsConstructor
3.5.2 作用范围
- 类或接口(ElementType.TYPE)
3.5.3 属性
- String staticConstructor:指定静态构造方法的名称。
3.6 @Value
3.6.1 作用
整合注解,加上@Value注解相当于加了以**解:
- @Getter (*注意没有@Setter)
- @ToString
- @EqualAndHashCode
- @RequiredArgsConstructor
@Value注解会把类中的所有字段包括类本身全部加上final修饰符。
3.6.2 作用范围
- String staticConstructor:指定静态构造方法的名称。
3.7 @Builder
3.7.1 作用
自动生成流式set值写法,创建对象时不需使用set方法。
原理是在类中生成一个Builder内部类,类中有对应的方法完成对象的创建。
3.7.2 作用范围
- 类或接口(ElementType.TYPE)
- 方法(ElementType.METHOD)
- 构造方法(ElementType.CONSTRUCTOR)
3.7.3 属性
- AccessLevel access:指定生成的构造方法的访问修饰符。
3.8 @Slf4j
3.8.1 作用
自动生成该类的log静态常量,可以直接使用日志。
3.8.2 作用范围
- 类或接口(ElementType.TYPE)
3.8.3 属性
- String topic:指定日志输出的类名,默认为本类的全限定类名。
4. Lombok原理简介
自从Java6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,
只要程序实现了该API,就能在javac运行的时候得到调用。
lombok本质上就是这样的一个实现了"JSR 269 API"的程序。
在使用javac的过程中,它产生作用的具体流程如下:
- javac对源代码进行分析,生成一棵抽象语法树(AST);
- 运行过程中调用实现了"JSR 269 API"的lombok程序;
- 此时lombok就对第一步骤得到的AST进行处理,
找到@Data注解所在类对应的语法树(AST),
然后修改该语法树(AST),
增加getter和setter方法定义的相应树节点; - javac使用修改后的抽象语法树(AST)生成字节码文件。
5. Lombok利与弊
5.1 优点
- 通过注解自动生成样板代码,提高开发效率;
- 代码简洁,只关注相关属性;
- 新增属性后,无需刻意修改相关方法等。
5.2 缺点
- 降低了源代码的可读性和完整性;
- 加大对问题排查的难度(可能问题定位到不存在的行,无从下手);
- 强 x 队友,因为需要 IDE 的相关插件的支持等。
上一篇: vue+vant 实现上拉加载 下拉刷新