Spring Boot 2从入门到入坟 | 最佳实践篇:使用Lombok插件来简化JavaBean的开发

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 2从入门到入坟 | 最佳实践篇:使用Lombok插件来简化JavaBean的开发相关的知识,希望对你有一定的参考价值。

写在前面

从这篇文章开始,我们来说一下以后在开发中用到的一些小技巧,这些小技巧是我们后来在编写代码时要经常用到的。在这篇文章中,我们首先来讲解第一个小技巧,即使用Lombok插件来简化我们JavaBean的开发。

使用Lombok插件来简化JavaBean的开发

我们之前在开发JavaBean的时候,还是有几处比较麻烦的地方的,不知你看出来了没有。

第一个麻烦之处是咱们要编写JavaBean的getter/setter方法;第二个麻烦之处是我们经常要为JavaBean添加有参/无参构造器,以及还得重写它的toString方法。而使用Lombok插件之后,这些我们就能简化掉了。

那怎么使用Lombok插件来简化我们JavaBean的开发呢?很简单,只须遵循下面这几个步骤即可。

引入对Lombok插件的依赖

首先,我们得给咱们的项目里面引入对Lombok插件的依赖,记住咱是不用写依赖版本号的,因为Spring Boot已经默认管理了该依赖的版本。关于这点,我们就已经在下面这篇文章中分析过了。

咱也不妨再看看,打开咱们maven项目的pom.xml文件,发现咱们的maven项目继承了如下这样一个父项目,该父项目是来做依赖管理的。

在这里插入图片描述

我们不妨点进以上父项目里面去看一看,如下图所示,发现它里面还有一个父项目。

在这里插入图片描述

我们不妨再来点进以上父项目里面去看一看,点进来以后,我们可以看到它里面有一对<properties></properties>标签,在该标签里面声明了几乎我们开发中常用的那些jar包的版本号,如下图所示。

在这里插入图片描述

咱不妨来搜索一下Lombok插件的依赖,看看它的版本号是多少,如下图所示,可以看到其版本号是1.18.20

在这里插入图片描述

还是回到主题吧!我们要做的第一步就是在maven项目里面引入对Lombok插件的依赖,如下所示。

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

在IDEA中搜索安装Lombok插件

除了在咱们的maven项目里面引入对Lombok插件的依赖之外,我们还得在IDEA中搜索安装Lombok插件,这样它就会来帮我们自动的生成JavaBean的getter/setter方法了,当然了,还有其他的东东。大家一定得注意了,Lombok插件是在程序编译的时候才会帮我们生成那些玩意,所以咱们的源代码看起来会很清晰。

至于如何在IDEA中安装Lombok插件,不用我屁话了吧!你要是真不会,不妨仔细看看我写的下面这篇博客。

在IDEA中安装插件很简单的啦!其实,如果你用的是比较新的IDEA,比如笔者用的IntelliJ IDEA 2020.3.3,那么你也不需要再安装Lombok插件了,因为IntelliJ IDEA 2020.3.3早就已经集成该插件了。

使用Lombok插件

现在,我们就能在咱的程序里面使用Lombok插件了。使用上该插件之后,在咱开发的JavaBean里面,你就再也不用写那些getter/setter方法、有参/无参构造器以及toString方法了,如此一来,JavaBean里面就保持得很干净了。当然,要是你不使用Lombok插件,而且还堂而皇之的不写属性的getter/setter方法,那么这些属性就相当于跟没有一样。

接下来,我就来告诉大家如何在咱开发的JavaBean里面使用Lombok插件(的注解)。

@Data注解

首先,我们来看Lombok插件里面的第一个注解,即@Data,该注解是来帮我们生成我们已有属性的getter/setter方法的。下面我就以Pet类为例来进行演示了哟😊

先把Pet类里面name属性的getter/setter方法给删除掉,然后在Pet类上标注一个@Data注解,如下所示。

package com.meimeixia.boot.bean;

import lombok.Data;

/**
 * @author liayun
 * @create 2021-04-23 19:16
 *
 * 宠物
 */
@Data
public class Pet {

    private String name;

    public Pet() {

    }

    public Pet(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Pet{" +
                "name='" + name + '\\'' +
                '}';
    }

}

这样,在程序编译的时候@Data注解就会帮我们生成name属性的getter/setter方法了。

@ToString注解

@ToString注解是在程序编译的时候自动帮我们生成JavaBean的toString方法的,注意不是在源代码中就给我们生成了哟😊,因此我们的源代码会看起来很清爽。

那么,@ToString注解该怎么用呢?很简单,先把Pet类里面的toString方法给删除掉,然后在Pet类上标注一个@ToString注解,如下所示。

package com.meimeixia.boot.bean;

import lombok.Data;
import lombok.ToString;

/**
 * @author liayun
 * @create 2021-04-23 19:16
 *
 * 宠物
 */
@Data
@ToString
public class Pet {

    private String name;

    public Pet() {

    }

    public Pet(String name) {
        this.name = name;
    }

}

@AllArgsConstructor注解

在JavaBean里面,我们得经常添加有参无参构造器,如果还是像之前一样以手写或者快捷键的方式来生成,未免有些麻烦。而现在用上Lombok插件之后,一个注解就能搞定了。这里,我们先来看一下@AllArgsConstructor注解,该注解是使用JavaBean中所有属性来帮我们生成一个有参构造器的,即全参构造器。

那么,@AllArgsConstructor注解该怎么用呢?很简单,先把Pet类里面的有参构造器给删除掉,然后在Pet类上标注一个@AllArgsConstructor注解,如下所示。

package com.meimeixia.boot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

/**
 * @author liayun
 * @create 2021-04-23 19:16
 *
 * 宠物
 */
@Data
@ToString
@AllArgsConstructor
public class Pet {

    private String name;

    public Pet() {

    }

}

@NoArgsConstructor注解

@NoArgsConstructor注解是来帮我们生成JavaBean的无参构造器的。

那么,@NoArgsConstructor注解该怎么用呢?很简单,先把Pet类里面的无参构造器给删除掉,然后在Pet类上标注一个@NoArgsConstructor注解,如下所示。

package com.meimeixia.boot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * @author liayun
 * @create 2021-04-23 19:16
 *
 * 宠物
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Pet {

    private String name;

}

看到了没有,咱们的源代码是不是看起来非常清爽了啊!

举一反三,大家接下来不妨将如下User类也给整改一下,不知道你会不会?

package com.meimeixia.boot.bean;

/**
 * @author liayun
 * @create 2021-04-23 19:14
 *
 * 用户
 */
public class User {

    private String name;
    private Integer age;

    private Pet pet;

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }

    public User() {

    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\\'' +
                ", age=" + age +
                ", pet=" + pet +
                '}';
    }

}

使用上Lombok插件里面的注解之后,不知道大家是不是写成了下面这样?

package com.meimeixia.boot.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * @author liayun
 * @create 2021-04-23 19:14
 *
 * 用户
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {

    private String name;
    private Integer age;

    private Pet pet;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

}

大家可一定要注意了,以上@AllArgsConstructor注解是来帮我们生成JavaBean的全参构造器的。如果你不想使用JavaBean中所有属性来生成一个有参构造器,例如只想使用JavaBean中name和age这两个属性来生成一个有参构造器,那么这就得你自己来写了,就像上面那样。这样,灵活性是不是就比较强一点了啊!

@EqualsAndHashCode注解

@EqualsAndHashCode注解是使用JavaBean中所有属性来帮我们重写JavaBean的equals和hashCode这俩方法的。

该注解使用起来也特别简单,即在JavaBean上标注该注解就行,如下所示。

package com.meimeixia.boot.bean;

import lombok.*;

/**
 * @author liayun
 * @create 2021-04-23 19:14
 *
 * 用户
 */
@Data
@NoArgsConstructor
//@AllArgsConstructor
@ToString
@EqualsAndHashCode
public class User {

    private String name;
    private Integer age;

    private Pet pet;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

}

@Slf4j注解

Lombok插件里面还有一个注解,即@Slf4j,使用上该注解之后就相当于注入了日志相关组件,因此可以简化日志开发,这样,我们以后就再也不用通过输出语句来打印日志了。若我们想要记录东西,则使用日志即可。

那么,@Slf4j注解又该怎么用呢?很简单,我们不妨在HelloController类上标注上该注解,如此一来,该注解就会自动给HelloController这个类里面注入log这样一个属性(组件)了,也即日志记录器,然后咱就可以使用该日志记录器来记录日志了。

package com.meimeixia.boot.controller;

import com.meimeixia.boot.bean.Car;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author liayun
 * @create 2021-04-19 4:24
 */
@Slf4j
@RestController
public class HelloController {

    @Autowired
    Car car; // car实例里面每一个属性的值都是跟配置文件进行绑定的

    @RequestMapping("/car")
    public Car car() {
        return car;
    }

    @RequestMapping("/hello")
    public String handle01(@RequestParam("name") String name) {
        // 在HelloController类上标注了@Slf4j注解之后,该注解会自动给HelloController这个类里面注入log这样一个属性(组件),也即日志记录器
        log.info("请求进来了......");
        return "Hello, Spring Boot 2!" + "你好:" + name;
    }

}

此时,我们就来做一个测试,看一下我们整个Spring Boot应用的所有功能是不是都能正常运行。

重新启动咱们的Spring Boot应用,然后在浏览器中访问hello请求,访问成功之后,可以看到我们的日志也是能正常打印出来的,如下图所示。

在这里插入图片描述

所以,如果我们后来要经常用到日志,那么只须使用@Slf4j这样一个注解就行了。

以上是关于Spring Boot 2从入门到入坟 | 最佳实践篇:使用Lombok插件来简化JavaBean的开发的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2从入门到入坟 | 最佳实践篇:devtools开发者工具的简单使用

Spring Boot 2从入门到入坟 | 最佳实践篇:使用Lombok插件来简化JavaBean的开发

Spring Boot 2从入门到入坟 | 基础入门篇:「Spring Boot 2从入门到入坟」系列教程介绍

Spring Boot 2从入门到入坟 | 基础入门篇:「Spring Boot 2从入门到入坟」系列教程介绍

Spring Boot 2从入门到入坟 | Best practices篇:Spring Initailizr的使用

Spring Boot 2从入门到入坟 | 基础入门篇:Spring Boot的大时代背景