微服务框架分析(微服务高级基础之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库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter或eques方法,同时可以自动化日志变量。

简而言之为:

Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。

在我们的Java项目中,一般充斥着太多不友好的代码:POJO的getter/setter/ToString;异常处理;I/O流的关闭操作等等,这些样板代码既没有技术含量,又影响着代码的美观,Lombok应运而生。

Lombok使用

需要特别注意,Lombok的使用除了项目中需要因要对应依赖包,而IDEA还需要引入Lombok插件。

1.maven 引入

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency>

2.Lombok 插件安装

使用Lombok需要插件的配合,我使用开发工具为Myeclipse2018,这里只讲解Myeclipse中安装lombok插件,使用IDEA的,可自行查找安装方法(可取官网查找,对应官网都有详细步骤)。

2.1 下载lombok.jar

官网下载地址:https://projectlombok.org/all-versions

2.2 运行lombok.jar

jar 包下载,双击jar文件即可。然后会弹出如下界面,继续点击 Specify location 按钮选择对应Myeclipse的执行路径。

微服务框架分析(微服务高级基础之Lombok详解)(2)

微服务框架分析(微服务高级基础之Lombok详解)(3)

微服务框架分析(微服务高级基础之Lombok详解)(4)

显示Install successful 表示安装成功。关闭窗口然后重启Myeclipse即可。

需要特别之处,之所以这样操作:

是由于Myeclipse内置的编译器不是Oracle javac,而是eclipse自己实现的Eclipse Compiler for Java (ECJ).要让ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下两项内容:

-Xbootclasspath/a:[lombok.jar所在路径。

安装完后,可以看下对应 myeclipse.ini 文件内容,该文件最后会新增一条记录:

微服务框架分析(微服务高级基础之Lombok详解)(5)

这个路径下的lombok.jar 则为刚才操作的内容。

3.Lombok实现原理

自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。

Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:

1. javac对源代码进行分析,生成一棵抽象语法树(AST)

2. javac编译过程中调用实现了JSR 269的Lombok程序

3. 此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树 (AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点

4. javac使用修改后的抽象语法树(AST)生成字节码文件

4.Lombok 使用示例

下面举两个栗子,看看使用lombok和不使用的区别。

4.1 没有使用 Lombok 的时候

PUBLIC class User { private Integer id; private String username; private Integer age; public User() {} public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

4.2 使用 Lombok 的时候

@Data public class User { private Integer id; private String username; private Integer age; }

@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

下面开始讲解 Lombok 的用法

5.Lombok注解的使用

5.1 POJO类常用注解:

1>@Getter/@Setter: 作用类上,生成所有成员变量的getter/setter方法;作用于成员变量上,生成该成员 变量的getter/setter方法。可以设定访问权限及是否懒加载等。

import lombok.Getter; import lombok.Setter; @Getter @Setter public class Person { private String name; private int age ; private String email; private String address; private String password; @Getter @Setter private boolean funny; }

2>@ToString:作用于类,覆盖默认的toString()方法,可以通过of属性限定显示某些字段,通过exclude属性排除某些字段。

@ToString(of= {"name","age"},exclude= {"email"}) @Getter(value=AccessLevel.PUBLIC) @Setter(value=AccessLevel.PUBLIC) public class Person { private String name; private int age ; private String email; private String address; private String password; private boolean funny; }

3>@EqualsAndHashCode:作用于类,覆盖默认的equals和hashCode

@NonNull:主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。

@EqualsAndHashCode @ToString(of= {"name","age"},exclude= {"email"}) @Getter(value=AccessLevel.PUBLIC) @Setter(value=AccessLevel.PUBLIC) public class Person { @NonNull private String name; private int age ; private String email; private String address; }

4>@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于类上,用于生成构造函数。有staticName、access等属性。

staticName属性一旦设定,将采用静态方法的方式生成实例,access属性可以限定访问权限。

@NoArgsConstructor:生成无参构造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成员变量的构造器;

@AllArgsConstructor:生成全参构造器

@EqualsAndHashCode @ToString(of= {"name","age"},exclude= {"email"}) @Getter(value=AccessLevel.PUBLIC) @Setter(value=AccessLevel.PUBLIC) @NoArgsConstructor(staticName="of",access=AccessLevel.PRIVATE) @RequiredArgsConstructor(access=AccessLevel.PACKAGE) @AllArgsConstructor(access=AccessLevel.PUBLIC) public class Person { @NonNull private String name; private int age ; private String email; private String address; }

5>其他注解

@Data:作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于类上,将类转变为建造者模式

@Log:作用于类上,生成日志变量。针对不同的日志实现产品,有不同的注解:

6.Lombok的优缺点

优点:

能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率

让代码变得简洁,不用过多的去关注相应的方法

属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

不支持多种参数构造器的重载

虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度

以上,为全部内容。

近期新型冠状病毒肆虐,各位一定做好防范,少出门,勤洗手,外出一定戴口罩。

,