1 介绍
Spring Boot是非常高效的开发框架,Lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用。
2 安装和配置
2.1 eclipse和STS安装Lombok
下载lombok最新版本:https://www.projectlombok.org/download ,使用cmd命令 java -jar 你的lombok jar路径,然后会弹出一个框 这里会自动搜索你的eclipse安装路径(如果搜索不到,自行选择),如下图:
安装完成后在你的sts安装路径下会有一个lombok.jar。同时你也可以看看sts.ini里面是否多了个lombok。
2.2 IntelliJ IDEA安装Lombok
打开IntelliJ IDEA后点击菜单栏中的File-->Settings,或者使用快捷键Ctrl+Alt+S进入到设置页面。
我们点击设置中的Plugins进行插件的安装,在右侧选择Marketplace,然后在搜索页面输入lombok变可以查询到下方的Lombok Plugin,鼠标点击Lombok Plugin可在右侧看到Install按钮,点击该按钮便可安装。
2.3 工程配置
在maven工程中的pom.xml添加配置信息:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
说明:这里也可以不指定版本,因为Spring Boot中已经默认引入了这个类库,且指定了其scope。
安装和配置完成成后,我们就可以使用lombok了。
3 Lombok插件的使用
3.1 好处
我们在开发过程中,经常会有一些重复性的功能代码需要编写,例如:实体类成员变量的Getter/Setter方法,构造函数以及toString, hashCode方法等。在使用Lombok之后,将由其来自动帮你实现代码生成,注意,其是在运行过程中,帮你自动生成的。就是说,将极大减少你的代码总量。
3.2 弊端
1、强制性
因为Lombok的使用要求开发者一定要在IDE中安装对应的插件。如果未安装插件的话,使用IDE打开一个基于Lombok的项目的话会提示找不到方法等错误。导致项目编译失败。也就是说,如果项目组中有一个人使用了Lombok,那么其他人就必须也要安装IDE插件。否则就没办法协同开发。
2、影响升级
因为Lombok对于代码有很强的侵入性,就可能带来一个比较大的问题,那就是会影响我们对JDK的升级。所以,如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。
3、破坏封装
如果我们在代码中直接使用Lombok,那么他会自动帮我们生成getter、setter 等方法,这就意味着,一个类中的所有参数都自动提供了设置和读取方法。
我这里只是列举出了笔者遇到过或认为存在的三个关键性问题,还存在其它一些问题,就不一一列举了。
3.3 注解详解
-
@Getter/@Setter
用在属性上,再也不用自己手写setter和getter方法了。用在类上作用给所有属性。
@Getter
@Setter
private Long id;
@Getter
@Setter
private String name;
不使用@Getter/@Setter注解后的写法,如下
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
-
@Builder
在Java类上使用Builder注解之后,我们可以使用如下代码为对象属性赋值。
SysUser sysUser = SysUser.builder()
.id(1)
.name("码农洞见")
.build();
不用@Builder注解的写法如下:
SysUser sysUser = new SysUser();
sysUser.setId(1);
sysUser.setName("码农洞见");
-
@AllArgsConstructor
用在类上,自动生成无参构造和使用所有参数的构造函数。
此外还有其它一下常用注解如:
-
@Data:注解在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对于POJO类十分有用
-
@NonNull:给方法参数增加这个注解会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出NPE(NullPointerException)
-
@Value:用在类上,是@Data的不可变形式,相当于为属性添加final声明,只提供getter方法,而不提供setter方法
3.4 实现原理
从上面的讲解我们不难发现,在Lombok使用过程中只要添加相应的注解,就可以简化代码量。 Lombok这款插件正是依靠可插件化的Java自定义注解处理API(JSR 269: Pluggable Annotation Processing API)来实现在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件”。其大体执行流程如下:
javac对源代码文件进行分析,编译生成了一棵抽象语法树(AST)。运行过程中调用实现了“JSR 269 API”的Lombok程序。此时Lombok就对第一步骤得到的AST进行处理,找到注解所在类对应的语法树(AST),然后修改该语法树(AST),增加相应树节点。javac使用修改后的抽象语法树(AST)生成字节码文件。
4 码农来洞见
在JSR 269 之前我们想实现这种神器,就必须使用反射,但是反射的方法局限性较大。首先,它必须定义@Retention为RetentionPolicy.RUNTIME,只能在运行时通过反射来获取注解值,使得运行时代码效率降低。其次,如果想在编译阶段利用注解来进行一些检查,对用户的某些不合理代码给出错误报告,反射的使用方法就无能为力了。而 JSR 269 之后我们可以在 Javac的编译期利用注解做这些事情。所以我们发现核心的区分是在 运行期 还是 编译期。
总结:建不建议在日常开发中使用,本人其实保持一个中立的态度。任何事物都有它的两面性,关键是我们要在使用之前认真考虑,如何达到自己的利益最大化。这需要使用者结合实际情况进行评估。