摘要
最近IDEA 2020最后一个版本要发布了,已经内置了Lombok插件,SpringBoot 2.1.x之后的版本也在Starter中内置了Lombok依赖。为什么他们都要支持Lombok呢?今天我来讲讲Lombok的使用,看看它有何神奇之处!
Lombok简介
Lombok是一款Java代码功能增强库,在Github上已有9.8k+Star。它会自动集成到你的编辑器和构建工具中,从而使你的Java代码更加生动有趣。通过Lombok的注解,你可以不用再写getter、setter、equals等方法,Lombok将在编译时为你自动生成。
Lombok集成
首先我们需要在IDEA中安装好Lombok插件,如果你使用的是最新版IDEA 2020.3,则Lombok插件已经内置,无需安装。
之后在项目的pom.xml文件中添加Lombok依赖,SpringBoot 2.1.x版本后无需指定Lombok版本,SpringBoot在spring-boot-dependencies中已经内置。
![](https://img.haomeiwen.com/i22576587/39cfa82894d8497f.png)
Lombok使用
Lombok中有很多注解,这些注解使得我们可以更加方便的编写Java代码,下面介绍下这些注解的使用。
val
使用val注解可以取代任意类型作为局部变量,这样我们就不用写复杂的ArrayList和Map.Entry类型了,具体例子如下。
![](https://img.haomeiwen.com/i22576587/51d4ab896eeeda4b.png)
当我们使用了val注解后,Lombok会从局部变量的初始化表达式推断出具体类型,编译后会生成如下代码。
![](https://img.haomeiwen.com/i22576587/1e505f7a43a45232.png)
@NonNull
在方法上使用@NonNull注解可以做非空判断,如果传入空值的话会直接抛出NullPointerException。
![](https://img.haomeiwen.com/i22576587/5ae2b4ec32705ff6.png)
编译后会在构造器中添加非空判断,具体代码如下。
![](https://img.haomeiwen.com/i22576587/ccd153cd0e6c22e7.png)
@Cleanup
当我们在Java中使用资源时,不可避免地需要在使用后关闭资源。使用@Cleanup注解可以自动关闭资源。
![](https://img.haomeiwen.com/i22576587/a2a9ed33801e6021.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/3efe6c5767c07f58.png)
@Getter/@Setter
有了@Getter/@Setter注解,我们再也不用编写getter/setter方法了。试想下之前即使我们使用IDEA自动生成getter/setter方法,如果类属性的类型和名称改了,又要重新生成getter/setter方法也是一件很麻烦的事情。
![](https://img.haomeiwen.com/i22576587/3838027357f659cb.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/06605a86eb9cabda.png)
@ToString
把所有类属性都编写到toString方法中方便打印日志,是一件多么枯燥无味的事情。使用@ToString注解可以自动生成toString方法,默认会包含所有类属性,使用@ToString.Exclude注解可以排除属性的生成。
![](https://img.haomeiwen.com/i22576587/98231a93076b1a34.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/93c675a107c0e5aa.png)
@EqualsAndHashCode
使用@EqualsAndHashCode注解可以自动生成hashCode和equals方法,默认包含所有类属性,使用@EqualsAndHashCode.Exclude可以排除属性的生成。
![](https://img.haomeiwen.com/i22576587/18b6b795cbdf9c6a.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/ee67b5b9f5ca58af.png)
@XxConstructor
使用@XxConstructor注解可以自动生成构造方法,有@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor三个注解可以使用。
@NoArgsConstructor:生成无参构造函数。
@RequiredArgsConstructor:生成包含必须参数的构造函数,使用@NonNull注解的类属性为必须参数。
@AllArgsConstructor:生成包含所有参数的构造函数。
![](https://img.haomeiwen.com/i22576587/41a40e2ce2cc4b74.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/330c673bbf65b794.png)
@Data
@Data是一个方便使用的组合注解,是@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstructor的组合体。
![](https://img.haomeiwen.com/i22576587/2afd35a02a445c15.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/60d35ff443f21204.png)
@Value
使用@Value注解可以把类声明为不可变的,声明后此类相当于final类,无法被继承,其属性也会变成final属性。
![](https://img.haomeiwen.com/i22576587/6305ea723aa20453.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/87d4163713923986.png)
@Builder
使用@Builder注解可以通过建造者模式来创建对象,建造者模式加链式调用,创建对象太方便了
![](https://img.haomeiwen.com/i22576587/b6960e86ad7c805a.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/2296906b20526361.png)
@SneakyThrows
还在手动捕获并抛出异常?使用@SneakyThrows注解自动实现试试!
![](https://img.haomeiwen.com/i22576587/e69da6a4ec5608a9.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/3770b7cf1b74c1d1.png)
@Synchronized
当我们在多个线程中访问同一资源时,往往会出现线程安全问题,以前我们往往使用synchronized关键字修饰方法来实现同步访问。使用@Synchronized注解同样可以实现同步访问。
![](https://img.haomeiwen.com/i22576587/c259cb8a1b422ce4.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/0abde0dfd5ecbf5e.png)
@With
使用@With注解可以实现对原对象进行克隆,并改变其一个属性,使用时需要指定全参构造方法。
![](https://img.haomeiwen.com/i22576587/2776a216323e6a69.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/c5c119836b2c208b.png)
@Getter(lazy=true)
当我们获取某一个属性比较消耗资源时,可以给@Getter添加lazy=true属性实现懒加载,会生成Double Check Lock 样板代码对属性进行懒加载。
![](https://img.haomeiwen.com/i22576587/dd62d067091a401a.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/f17001697455da23.png)
@Log
使用@Log注解,可以直接生成日志对象log,通过log对象可以直接打印日志。
![](https://img.haomeiwen.com/i22576587/5d382c2e643d6c93.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/0eb2cdb2b2f339b3.png)
@Slf4j
使用Lombok生成日志对象时,根据使用日志实现的不同,有多种注解可以使用。比如@Log、@Log4j、@Log4j2、@Slf4j等。
![](https://img.haomeiwen.com/i22576587/abb7b2d621f74fc5.png)
编译后Lombok会生成如下代码。
![](https://img.haomeiwen.com/i22576587/cb6b244f9f1d2c64.png)
Lombok原理
如果IDEA不安装Lombok插件的话,我们打开使用Lombok的项目是无法通过编译的。装了以后IDEA才会提示我们Lombok为我们生成的方法和属性。
使用了@Data注解以后,查看类结构可以发现getter、setter、toString等方法。
![](https://img.haomeiwen.com/i22576587/45dba8ea617761da.png)
打开target目录下的.class文件,我们可以看到Lombok为我们生成的代码,可见Lombok是通过解析注解,然后在编译时生成代码来实现Java代码的功能增强的。
![](https://img.haomeiwen.com/i22576587/8de1cc9f5ff25d0a.png)
网友评论