Lombok详细教程及idea中lombok插件的安装
⼀、背景
我们在开发过程中,通常都会定义⼤量的JavaBean,然后通过IDE去⽣成其属性的构造器、getter、setter、equals、hashcode、toString⽅法,当要对某个属性进⾏改变时,⽐如命名、类型等,都需要重新去⽣成上⾯提到的这些⽅法,那java中有没有⼀种⽅式能够避免这种重复的劳动呢?答案是有,我们来看⼀下下⾯这张图,右⾯是⼀个简单的JavaBean,只定义了两个属性,在类上加上了@Data,从左⾯的结构图上可以看到,已经⾃动⽣成了上⾯提到的⽅法。
⼆、Lombok简介
三、Lombok使⽤
lombok插件的安装
IDEA中添加Lombok插件,File->Setting->Plugins搜索Lombok Plugin,点击install,安装完成后重启IDEA
让idea⽀持lombok编译
勾选idea的Enable annotation processing选项,该选项在Preference——Build,Execution,Deployment——Compiler——Annotation Processors中
在maven项⽬的l中添加依赖
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>最新版idea安装详细教程
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
四、Lombok注解介绍
@Data:注解在类上,将类提供的所有属性都添加get、set⽅法,并添加、equals、canEquals、hashCode、toString⽅法
@Setter:注解在类上,为所有属性添加set⽅法、注解在属性上为该属性提供set⽅法
@Getter:注解在类上,为所有的属性添加get⽅法、注解在属性上为该属性提供get⽅法
@NotNull:在参数中使⽤时,如果调⽤时传了null值,就会抛出空指针异常
@Synchronized ⽤于⽅法,可以锁定指定的对象,如果不指定,则默认创建⼀个对象锁定
@Log作⽤于类,创建⼀个log属性
@Builder:使⽤builder模式创建对象
@NoArgsConstructor:创建⼀个⽆参构造函数
@AllArgsConstructor:创建⼀个全参构造函数
@ToStirng:创建⼀个toString⽅法
@Accessors(chain = true)使⽤链式设置属性,set⽅法返回的是this对象。
@RequiredArgsConstructor:创建对象
@UtilityClass:⼯具类
@ExtensionMethod:设置⽗类
@FieldDefaults:设置属性的使⽤范围,如private、public等,也可以设置属性是否被final修饰。
@Cleanup: 关闭流、连接点。
@EqualsAndHashCode:重写equals和hashcode⽅法。
@toString:创建toString⽅法。
1、@Getter / @Setter注解
可以作⽤在类上和属性上,放在类上,会对所有的⾮静态(non-static)属性⽣成Getter/Setter⽅法,放在属性上,会对该属性⽣成Getter/Setter⽅法。并可以指定Getter/Setter⽅法的访问级别。当然了属性上⾯的Getter和Setter的设置要优先于类上⾯的
2、@EqualsAndHashCode注解
默认情况下,会使⽤所有⾮瞬态(non-transient)和⾮静态(non-static)字段来⽣成equals和hascode⽅法,也可以指定具体使⽤哪些属性。
1). 此注解会⽣成equals(Object other) 和 hashCode()⽅法。
2). 它默认使⽤⾮静态,⾮瞬态的属性
3). 可通过参数exclude排除⼀些属性
4). 可通过参数of指定仅使⽤哪些属性
5). 它默认仅使⽤该类中定义的属性且不调⽤⽗类的⽅法
6). 可通过callSuper=true解决上⼀点问题。让其⽣成的⽅法中调⽤⽗类的⽅法。
3、@ToString
⽣成toString⽅法,默认情况下,会输出类名、所有属性,属性会按照顺序输出,以逗号分割。
4、@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
@NoArgsConstructor : ⽣成⼀个⽆参数的构造⽅法
@AllArgsContructor: ?会⽣成⼀个包含所有变量
@RequiredArgsConstructor: 会⽣成⼀个包含常量,和标识了NotNull的变量的构造⽅法。⽣成的构造⽅法是私有的private。
5、@Data
@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
通过官⽅⽂档,可以得知,当使⽤@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和hashCode()⽅法,且不会使⽤⽗类的属性,这就导致了可能的问题。 ⽐如,有多个类有相同的部分属性,把它们定义到⽗类中,恰好
id(数据库主键)也在⽗类中,那么就会存在部分对象在⽐较时,它们并不相等,却因为lombok⾃动⽣成的equals(Object other) 和hashCode()⽅法判定为相等,从⽽导致出错。
修复此问题的⽅法很简单:
(1)、使⽤@Getter @Setter @ToString代替@Data并且⾃定义equals(Object other) 和 hashCode()⽅法,⽐如有些类只需要判断主键id是否相等即⾜矣。
(2)、 或者使⽤在使⽤@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。设置该属性的话需要保证当前类继承了⽗类
6、@slf4j
相当于在类中书写了 private static final Logger log = Logger(User.class);
五、Lombok原理
了解了简单的使⽤之后,现在应该⽐较好奇它是如何实现的。整个使⽤的过程中,只需要使⽤注解⽽已,
不需要做其它额外的⼯作,那⽞妙之处应该是在注解的解析上。JDK5引⼊了注解的同时,也提供了两种解析⽅式
1、运⾏时解析
运⾏时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。flect反射包中提供了⼀个接⼝AnnotatedElement,该接⼝定义了获取注解信息的⼏个⽅法,Class、Constructor、Field、Method、Package等都实现了该接⼝,⼤部分开发者应该都很熟悉这种解析⽅式。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass);
<T extends Annotation> T getAnnotation(Class<T> annotationClass);
Annotation[] getAnnotations();
Annotation[] getDeclaredAnnotations();
2、编译时解析
编译时解析有两种机制,⽹上很多⽂章都把它俩搞混了,分别简单描述⼀下。
(1)、Annotation Processing Tool
apt⾃JDK5产⽣,JDK7已标记为过期,不推荐使⽤,JDK8中已彻底删除,⾃JDK6开始,可以使⽤Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:
1)、api都在com.sun.mirror⾮标准包下
2)、没有集成到javac中,需要额外运⾏
apt的更多介绍可以参见。
(2)、Pluggable Annotation Processing API
JSR 269,⾃JDK6加⼊,作为apt的替代⽅案,它解决了apt的两个问题,javac在执⾏的时候会调⽤实现了该API的程序,这样我们就可以对编译器做⼀些增强,这时javac执⾏的过程如下:
  Lombok就是使⽤这种⽅式实现的,有兴趣的话可以去看看其Lombok源码,对应注解的实现都在HandleXXX中,⽐如@Getter注解的实现是HandleGetter.handle()。还有⼀些其它类库使⽤这种⽅式实现,⽐如Google Auto、Dagger等等。
六、Lombok初学者使⽤建议
在刚开始使⽤Lombok的时候建议⼤家可以多看看class⽂件,来加深对你所需要使⽤注解的理解。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。