零、前言
Lombok开发利器,非常简单的一个工具。此片博客参看:
- 官网:https://projectlombok.org/
- B站编程不良人:https://www.bilibili.com/video/BV1gg4y1v7Mi
使用Lombok环境要求:JDK1.8+,MAVEN,IDEA,Internet,… 。
在IDEA中安装使用步骤:
- 引入pom依赖
- 安装Lombok插件(需要重启)
- 在对应类上加上注解
文章目录
一、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.
简而言之就是Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码(getter/setter/hashcode/equals等)。仅五个字符(@Data)就可以替换数百行代码从而产生干净。
2.项目中使用Lombok
2.1 引入依赖
直接在官网获取依赖,或者去maven远程仓库查看依赖(我获取的是Lombok官网的最新版本)
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
2.2 安装Lombok插件
在IDEA中默认是不支持Lombok的,即使引入了依赖也不支持。为了使得IDEA能正常使用Lombok,就必须的安装一个Lombok的插件(安装之后重启生效)
之后,需要设置Annotation Processors(开启表示在编译时注解生效,不开启不影响使用)
2.3 使用提供的注解
在新建Entity类之后,在类上加上@Data注解
@Data // lombok插件 简化实体类开发
public class User {
private String username;
private String password;
}
就实体类的gette,setter,equals,hashcode,tostring等一系列方法。可以开启Structure查看类结构:
之后就可正常的调用。非常的简单。
二、Lombok分析
1.Lombok注解
1.1 常用的Lombok注解
@Data:作用在类上,生成GET SET 等一系列相关方法。具体用法参考前面的使用。
@Getter/@Setter/@ToString:作用在类上,只是生成get/set/toString方法。
@AllArgsConstructor/@NoArgsConstructor:作用在类上,提供全参和无参构造方法,要生成特定参数的构造方法需要手写。
@Accessors:作用在类上,设置chain属性chain = true表示开启链式操作,比如链式使用set方法
@Data
@Accessors(chain = true)
public class User {
private String username;
private String password;
}
之后支持链式调用
public static void main(String[] args) {
User user = new User();
user.setUsername("张三").setPassword("123"); // 链式操作
}
@Slf4j:作用在类上(需要使用Logger的类),快速定义日志定义,直接调用log即可。相当于在这个类中声明了一个日志对象,即等价于如下操作
private Logger log = LoggerFactory.getLogger(this.getClass());
示例代码(这里还扩展了Logger的info方法,详细查看api):
@RestController
@Slf4j
public class HelloController {
@GetMapping("/user")
public User getUser(String name, int age){
// log 不用创建 他就是Logger类的实例化
log.info("姓名:[{}],年龄:[{}]",name,age); //输出 姓名:[张三],年龄:[18]
return new User();
}
}
1.2 注解@Data
这里分析一下@Data注解,其他的注解分析方式都差不多。
首先是查看 官方介绍 ,找到@Data处
通过翻译我们能够查看一下官方对@Data的描述,简而言之就是 使用@Data注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用。
之后,我们查看一下**@Data**注解源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
String staticConstructor() default "";
}
说明此注解是在SOURCE阶段生效,即编译阶段生效,也正是由于这个因素,会带来一些开发人员反感的点。
Lombok其他的注解都能也是多查看一下 官方描述文档,照葫芦画瓢即可 ^_^ ~
2.Lombok注解修饰后实体类执行情况
这里涉及到的知识点大部分是关于Java注解的和运行时段的
经过上面的注解源码的分析,可知道Lombok生效是在compiler编译阶段,也就是说在我们编译好之后,实体类诸多方法都已经存在编译好的代码里了(这里我们可以查看)。
明确这一点之后,Java代码的执行流程就回到我们非常熟悉的流程了。
Lombok生效的时间和SpringBoot中的注解不一样,前者是在compiler编译时生效,后者是在RUNTIME运行时生效。
3. Lombok的缺点
我们是使用@Data注解大大减少了代码量,使代码非常简洁。这也是很多开发者热衷于使用Lombok的主要原因。即使这样,还是会有让人诟病的地方:
3.1 强制安装IDE插件
Lombok的使用要求开发者一定要在IDE中安装对应的插件。
即项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件;定义一个jar包中使用了Lombok,所有依赖这个jar包的所有应用都必须安装插件。
3.2 代码可读性、可调试性低
Lombok自动生成的代码都是在编译时期生成的代码,所以在开发过程中,很多代码是缺失的。
由于代码的缺失,可读性减低,代码调试带来一定的问题。比如,某个类的属性的get方法被哪些类引用,不能简单获取到。
3.3 生成的代码不一定可靠
Lombok很方便,但对各种注解的底层不了解的话,很容易产生各种奇奇怪怪的问题。就比如实体类被@Data修饰后,会自动生成equals()方法,但是如果只使用了@Data,而不使用 @EqualsAndHashCode(callSuper=true),会默认是@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。
3.4 破坏封装性
众所周知,Java的三大特性包括封装性、继承性和多态性。使用Lombok,一个类中的所有参数都自动提供了设置和读取方法,这可能会破坏了代码的封装性。比如当一个类中的两个参数变化必须是同时的,而Lombok提供的public的getter/setter方法是能随意修改的,这并不能达到我们所预期的效果。
三、结语
通过以上分析,了解到了Lombok的优点和缺点,那么到底要不要在项目中使用它?
这应该根据项目的需求而定,能想到它的优点的同时,还能考虑到它给代码程序带来的麻烦。