当前位置:首页 > 文章中心 > 正文内容

springboot从零入门实战:使用Lombok来优雅地编码!

使用Lombok来优雅地编码

在项目开发过程中,实体类需要通过IDEA自动生成get和set方法,非常烦琐,而且这个工作没有什么技术含量。使用Lombok可以代替这些方法的生成,只需要一个简单的注解就能完成之前烦琐的创建过程,从而提高开发者的开发效率。下面介绍Lombok的原理和使用。

认识Lombok插件

Lombok是一个Java插件,它通过注解来简化一些臃肿的Java代码,尤其适用于Java实体类对象。例如,新建一个实体类,然后添加几个属性,通常使用IDEA自动生成属性的get和set方法与构造函数,Lombok不再手动生成这些方法,它会在源码编译时自动生成,项目开发时,只需要添加相应的注解即可。


Lombok插件是在编译期起作用的,它在编译时生效的具体流程如下:

(1)Java编译器对源代码进行分析,生成一棵抽象语法树(AST)。

(2)运行过程中调用实现了JSR 269 API的Lombok程序。

(3)Lombok对抽象语法树进行处理,找到标记有@Data注解的类所对应的语法树,然后修改该语法树,增加get和set方法定义的相应树节点。

(4)编译器使用修改后的抽象语法树生成字节码文件,即在编译后的class文件中添加get和set方法。

(5)查看反编译后的class文件,即可看到生成后的方法代码。

安装Lombok插件

要在项目开发中使用Lombok,需要先为IDE安装Lombok插件,下面分别介绍Eclipse和IDEA的Lombok插件的安装步骤。

1. Eclipse插件的安装方法

(1)下载Lombok插件的jar包,本次使用的插件版本为1.12.6。

(2)把下载好的Lombok的jar包放到Eclipse的安装目录下,本机为D:\Program Files (x86)\eclipse,请更换为自己的计算机目录。

(3)执行以下命令,为Eclipse安装Lombok插件,显示效果如图2.16所示。

java -jar D:\Program Files (x86)\eclipse\lombok-1.12.6.jar

只需要选中需要安装的Eclipse,选择Install/Update命令就可以进行安装。安装完成后查看Eclipse的配置文件eclipse.ini,发现其增加了两行配置,如图2.17所示。

至此Lombok插件安装成功,可以在Eclipse中使用Lombok的注解进行项目开发了。

2. IDEA插件的安装方法

(1)首先打开IDEA的设置,单击Plugins选项,会出现如图2.18所示的界面。

(2)在搜索框中输入“lombok”进行搜索,结果如图2.19所示。单击Install按钮就可以安装(因为本机已经安装了Lombok,所以这里显示Installed),安装完成后,会提示重启IDEA,重启完成后就可以使用Lombok的注解进行开发了。

实战:使用Lombok插件

要使用Lombok,需要添加Lombok的Maven依赖,其代码如下

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

<version>1.16.12</version>

</dependency>

在项目开发过程中,Java类只有固定的几个方法可以使用注解自动生成,包括get/set方法、构造方法和ToString()方法等。常用的Lombok注解参见表2.5。

下面演示@Builder注解的使用过程。

(1)新建
com.onyx.springbootdemo.vo包,在其中添加一个测试类Test,代码如下:

import lombok.Builder;

public class Test {

public static void main(String[] args) {

//手动创建set方法

User1 user1 = new User1(); user1.setId(1);

user1.setName("cc");

//Builder注解后的链式写法

User2 user2 = User2.builder().id(1).name("cc").build();

}

private static class User1{

private int id;

private String name;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

//@Builder注解

@Builder

private static class User2{

private int id;

private String name;

}

}

查看Test类编译后的class文件反编译后的文件,编译器已经把Lombok的注解去掉,并且添加了相应的注解方法。以下为反编译文件,此文件在target\classes\(包名)目录下:

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//import java.beans.ConstructorProperties;

public class Test {

public Test() {

}

public static void main(String[] args) {

Test.User1 user1 = new Test.User1();

user1.setId(1);

user1.setName("cc");

Test.User2 user2 =

Test.User2.builder().id(1).name("cc").build();

}

private static class User2 {

private int id;

private String name;

@ConstructorProperties({"id", "name"})

User2(final int id, final String name) {

this.id = id;

this.name = name;

}

public static Test.User2.User2Builder builder() {

return new Test.User2.User2Builder();

}

public static class User2Builder {

private int id;

private String name;

User2Builder() {

}

public Test.User2.User2Builder id(final int id) {

this.id = id;

return this;

}

public Test.User2.User2Builder name(final String name) {

this.name = name;

return this;

}

public Test.User2 build() { return new Test.User2(this.id, this.name);

}

public String toString() {

return "Test.User2.User2Builder(id=" + this.id + ",

name=" + this.name + ")";

}

}

}

private static class User1 {

private int id;

private String name;

private User1() {

}

public int getId() {

return this.id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

}

}

如果类上标记@SLF4J,相当于以下代码,这样就能使用日志组件:

/** logger日志 */

private static final Logger log =

LoggerFactory.getLogger(Product.class);

(2)新建Product类,源码如下:

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import lombok.extern.slf4j.Slf4j;

@Data

@Slf4j

@NoArgsConstructor

@AllArgsConstructor

public class Product {

private int id;

private String name;

}

反编译后的文件代码如下:

//

// Source code recreated from a .class file by IntelliJ IDEA

// (powered by Fernflower decompiler)

//

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Product {

private static final Logger log =

LoggerFactory.getLogger(Product.class);

private int id;

private String name;

public int getId() {

return this.id;

}

public String getName() {

return this.name;

}

public void setId(final int id) { this.id = id;

}

public void setName(final String name) {

this.name = name;

}

public boolean equals(final Object o) {

if (o == this) {

return true;

} else if (!(o instanceof Product)) {

return false;

} else {

Product other = (Product)o;

if (!other.canEqual(this)) {

return false;

} else if (this.getId() != other.getId()) {

return false;

} else {

Object this$name = this.getName();

Object other$name = other.getName();

if (this$name == null) {

if (other$name != null) {

return false;

}

} else if (!this$name.equals(other$name)) {

return false;

}

return true;

}

}

}

protected boolean canEqual(final Object other) {

return other instanceof Product;

}

public int hashCode() {

int PRIME = true;

int result = 1;

int result = result * 59 + this.getId();

Object $name = this.getName(); result = result * 59 + ($name == null ? 43 : $name.hashCode());

return result;

}

public String toString() {

int var10000 = this.getId();

return "Product(id=" + var10000 + ", name=" + this.getName() +

")";

}

//空参构造

public Product() {

}

//全参构造器

public Product(final int id, final String name) {

this.id = id;

this.name = name;

}

}

根据笔者的开发经验,在项目中使用Lombok有以下几个注意点:

@Data注解实现了@EqualsAndHashCode的功能,如果一个类继承的父类使用了@EqualsAndHashCode(callSuper = true)注解,则当前类由Lombok生成的equals()方法只有在两个对象相同时才会返回true,否则为false,无论它们的属性是否相同。这个特性是不符合预期的,对于这种情况可以重写equals(),而Lombok不会影响开发者已经重写的方法,如toString()方法。

解决方法:

(1)用了@Data就不要有继承关系,类似于Kotlin的做法。

(2)自己重写equals(),Lombok不会影响开发者已经重写的方法,如toString()方法。

(3)显式地使用@EqualsAndHashCode(callSuper=true),Lombok会以显式指定的equals()方法和hashcode()方法为准。

扫描二维码推送至手机访问。

版权声明:本文由第六芝士网发布,如需转载请注明出处。

本文链接:http://www.dgx666.com/post/3738.html

分享给朋友:

“springboot从零入门实战:使用Lombok来优雅地编码!” 的相关文章

继微信后,QQ也对小学生“下手”了

前几天腾讯准备推出“微信儿童版”的消息在网上引发热议家长们纷纷表示:强烈支持!戳图片回顾事件▼而继微信后QQ也开始对小学生“下手”了今天(18日)腾讯公司在微信公众号宣布QQ已上线青少年模式在推文里腾讯首先给大家介绍他们为何要推出QQ青少年模式想给大家更简洁的社交体验更纯粹的学习氛围最大程度上减少信...

安装AUTOCAD时,出现错误1606,如何解决?林老师教你2个解决方法

如果安装AutoCAD或者卸载(修改)等操作是,弹出错误1606。无法访问网络位置窗口时候,看下面的操作。网上很多都是千篇一律,修改注册表一类。我试过后,基本上无效,但也不代表其他人无效,所以我将讲解两种方法。我这里没有指明版本,但是你可以试试。因为我旨在成功。第一种:修改注册表打开注册表(WIN+...

魔兽争霸官方对战平台RPG游戏大厅今日上线

【百万玩家最喜爱的游戏娱乐媒体,把最带劲的娱乐资讯,最权威的游戏推荐,最齐全的手游礼包放进你的口袋,却不用你多安装一个APP,还等什么?赶紧就关注微信号 【kdyx91】 每日七点不见不散~】魔兽争霸官方对战平台(dz.163.com)自上线以来,一直受到《魔兽争霸Ⅲ》爱好者们的喜爱和支持。在1V1...

CAD2007基础入门槽孔图纸绘制 #cad2007

大家好,今天给大家分享一个简单的入门绘图案例。1. 这是一个八十的距离,这里也是八十,这里是一百六,这里面是一个二十。这个图非常简单。2. 第一步,直接输入矩形的命令 ic,输进去空格,指定第一个角点鼠标点一下。3. 第二步,设置尺寸,所以输入 d 空格,第一个距离八十,输进去空格,八十输进去,然后...

三款好看好用的电脑桌面便签备忘录推荐

怎么在Win电脑桌面上添加便签/备忘录显示呢?给大家介绍三款常用的桌面便签备忘录工具!1、电脑自带便笺工具:sticky notesWindows系统自带的便笺工具,英文名sticky notes,在电脑桌面上点击“开始”,即可在程序列表中找到并打开。它以一张一张的彩色便利贴呈现在桌面上,可以记录简...

电脑好用便签软件推荐用哪个?PC端透明桌面便签

可以在Windows电脑端应用的便签软件琳琅满目,好用的便签软件推荐大家可关注敬业签,诸如工作、生活、学习等方面容易忘记的备忘任务都可以记录在敬业签中,使用时可以创建多个分类标签记录。记录类型多样化一、便签有需要保存的图片、文档、音频、视频、表格、PPT等文件可以用便签来记录,便签支持一键拖入多个文...