SpringBoot系列-- SpringBoot中使用lombok简化开发

1. 项目环境

  • IDEA 2020.1.4
  • Maven 3.6
  • JDK 1.8
  • SpringBoot 2.x

项目文件在GitHub(欢迎star⭐):
https://github.com/Gang-bb/Gangbb-SpringBoot

如有疑问或是建议,欢迎评论区留言或者QQ:949526365

lombok官方文档:https://projectlombok.org/features/all

2.添加依赖和安装插件

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

在这里插入图片描述

好像Lombok的Idea插件不可以离线安装,晕!

3. 实体类常用注解总结

3.1 @Setter、@Getter

为变量默认生成public的get、set方法,我们也可以指定 访问控制修饰符。

使用后默认生成一个无参的构造函数。

在这里插入图片描述

对final变量只会生成get方法、set不会;statis变量不会生成get或set方法!

3.1.1 注解在属性上

在这里插入图片描述

编译后的代码:

在这里插入图片描述

3.1.2 注解在类上

类中所有非静态属性都生成set、get方法

在这里插入图片描述

编译后:

在这里插入图片描述

可以指定不生成get或set的属性:

在这里插入图片描述

编译后:

在这里插入图片描述

3.1.3 注解对静态属性和final类型属性

在这里插入图片描述

编译后:

image-20210129073914919

3.2 @NoArgsConstructor

生成无参构造函数

image-20210129074135017

编译后:

在这里插入图片描述

3.3 @AllArgsConstructor

该注解提供一个全参数的构造方法,默认不提供无参构造。

image-20210129074616558

编译后:

在这里插入图片描述

3.4 @RequiredArgsConstructor

将标记为@NoNullfinal的属性生成一个构造器。

所有未初始化的 final 字段,以及未初始化的用 @NonNull 标记的字段,都会获得一个参数。对于标有 @NonNull 的字段,还会生成显式空检查。如果用于标记为 @NonNull 的字段的任何参数是 null,则构造函数将抛出 NullPointerException。参数的顺序与字段在类中的显示顺序相匹配。

在这里插入图片描述

编译后:

在这里插入图片描述

3.5 @ToString

该注解应用在类上,为我们生成Object的toString方法。生成全部参数的toString()

image-20210129081258961

编译后:

在这里插入图片描述

使用excledu和of自定义toString()中的参数:

exclude属性禁止在toString方法中使用某字段,而of可以指定需要使用的字段。如果使用了这两属性,未出现在这两属性声明中的类变量默认是排除在外。

image-20210129081522059

编译后:

在这里插入图片描述

3.6 @EqualsAndHashCode

生成equals()方法和hashCode方法

该注解应用在类上,lombok会为我们生成equals(Object other)和hashCode()方法,包括所有非静态属性和非transient的属性;同样可以使用exclude属性禁止在toString方法中使用某字段,而of可以指定需要使用的字段;也可以通过callSuper属性在重写的方法中使用父类的字段,这样我们可以更加灵活的定义bean的比对,如下图:

image-20210129084529097

编译后:

public class User2 {
    private String type;
    private Integer id;
    private String remark;
    private String age;

    public User2() {
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof User2)) {
            return false;
        } else {
            User2 other = (User2)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                label59: {
                    Object this$id = this.id;
                    Object other$id = other.id;
                    if (this$id == null) {
                        if (other$id == null) {
                            break label59;
                        }
                    } else if (this$id.equals(other$id)) {
                        break label59;
                    }

                    return false;
                }

                Object this$type = this.type;
                Object other$type = other.type;
                if (this$type == null) {
                    if (other$type != null) {
                        return false;
                    }
                } else if (!this$type.equals(other$type)) {
                    return false;
                }

                Object this$remark = this.remark;
                Object other$remark = other.remark;
                if (this$remark == null) {
                    if (other$remark != null) {
                        return false;
                    }
                } else if (!this$remark.equals(other$remark)) {
                    return false;
                }

                Object this$age = this.age;
                Object other$age = other.age;
                if (this$age == null) {
                    if (other$age != null) {
                        return false;
                    }
                } else if (!this$age.equals(other$age)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof User2;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $id = this.id;
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        Object $type = this.type;
        result = result * 59 + ($type == null ? 43 : $type.hashCode());
        Object $remark = this.remark;
        result = result * 59 + ($remark == null ? 43 : $remark.hashCode());
        Object $age = this.age;
        result = result * 59 + ($age == null ? 43 : $age.hashCode());
        return result;
    }
}

3.7 @Data(常用)

@Data=@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor+@RequiredArgsConstructor

  • 所有生成的 getter 和 setter 都将是 public 的。要覆盖访问级别,请使用显式的 @Setter 和/或 @Getter 注解对字段或类进行注释。你还可以使用此注解(通过将其与 AccessLevel.NONE 组合)来完全禁止生成 getter 和/或 setter。
  • 标记为 transient 的所有字段都不会被 hashCodeequals 考虑。将完全跳过所有静态字段(不考虑任何生成的方法,并且不会为它们创建 setter / getter)。
  • 针对其equals()方法,当它进行属性比较时,其实只比较了当前类中的属性。如果两个子类对象,其子类中的属性相同、父类中的属性不同时,利用equals()方法时,依旧会认为这两个对象相同。用了@Data就不要有继承关系。

image-20210129090133403

编译后:

public class Data {
    private String type;
    private Integer id;
    private String remark;
    private Integer age;
    private Boolean status;
    private Long other_id;

    public Data() {
    }

    public String getType() {
        return this.type;
    }

    public Integer getId() {
        return this.id;
    }

    public String getRemark() {
        return this.remark;
    }

    public Integer getAge() {
        return this.age;
    }

    public Boolean getStatus() {
        return this.status;
    }

    public Long getOther_id() {
        return this.other_id;
    }

    public void setType(final String type) {
        this.type = type;
    }

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

    public void setRemark(final String remark) {
        this.remark = remark;
    }

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

    public void setStatus(final Boolean status) {
        this.status = status;
    }

    public void setOther_id(final Long other_id) {
        this.other_id = other_id;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Data)) {
            return false;
        } else {
            Data other = (Data)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$id = this.getId();
                Object other$id = other.getId();
                if (this$id == null) {
                    if (other$id != null) {
                        return false;
                    }
                } else if (!this$id.equals(other$id)) {
                    return false;
                }

                Object this$age = this.getAge();
                Object other$age = other.getAge();
                if (this$age == null) {
                    if (other$age != null) {
                        return false;
                    }
                } else if (!this$age.equals(other$age)) {
                    return false;
                }

                Object this$status = this.getStatus();
                Object other$status = other.getStatus();
                if (this$status == null) {
                    if (other$status != null) {
                        return false;
                    }
                } else if (!this$status.equals(other$status)) {
                    return false;
                }

                label62: {
                    Object this$other_id = this.getOther_id();
                    Object other$other_id = other.getOther_id();
                    if (this$other_id == null) {
                        if (other$other_id == null) {
                            break label62;
                        }
                    } else if (this$other_id.equals(other$other_id)) {
                        break label62;
                    }

                    return false;
                }

                label55: {
                    Object this$type = this.getType();
                    Object other$type = other.getType();
                    if (this$type == null) {
                        if (other$type == null) {
                            break label55;
                        }
                    } else if (this$type.equals(other$type)) {
                        break label55;
                    }

                    return false;
                }

                Object this$remark = this.getRemark();
                Object other$remark = other.getRemark();
                if (this$remark == null) {
                    if (other$remark != null) {
                        return false;
                    }
                } else if (!this$remark.equals(other$remark)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof Data;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $id = this.getId();
        int result = result * 59 + ($id == null ? 43 : $id.hashCode());
        Object $age = this.getAge();
        result = result * 59 + ($age == null ? 43 : $age.hashCode());
        Object $status = this.getStatus();
        result = result * 59 + ($status == null ? 43 : $status.hashCode());
        Object $other_id = this.getOther_id();
        result = result * 59 + ($other_id == null ? 43 : $other_id.hashCode());
        Object $type = this.getType();
        result = result * 59 + ($type == null ? 43 : $type.hashCode());
        Object $remark = this.getRemark();
        result = result * 59 + ($remark == null ? 43 : $remark.hashCode());
        return result;
    }

    public String toString() {
        return "Data(type=" + this.getType() + ", id=" + this.getId() + ", remark=" + this.getRemark() + ", age=" + this.getAge() + ", status=" + this.getStatus() + ", other_id=" + this.getOther_id() + ")";
    }
}

3.8 @Builder

构造Builder模式的结构。通过内部类Builder()进行构建对象,使用该注解后默认生成全参toString()

@Builder 允许你使用以下代码自动生成使你的类可实例化所需的代码:

Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

image-20210129090920301

编译后:

public class User3 {
    private String type;
    private Integer id;
    private String remark;

    User3(final String type, final Integer id, final String remark) {
        this.type = type;
        this.id = id;
        this.remark = remark;
    }

    public static User3.User3Builder builder() {
        return new User3.User3Builder();
    }

    public static class User3Builder {
        private String type;
        private Integer id;
        private String remark;

        User3Builder() {
        }

        public User3.User3Builder type(final String type) {
            this.type = type;
            return this;
        }

        public User3.User3Builder id(final Integer id) {
            this.id = id;
            return this;
        }

        public User3.User3Builder remark(final String remark) {
            this.remark = remark;
            return this;
        }

        public User3 build() {
            return new User3(this.type, this.id, this.remark);
        }

        public String toString() {
            return "User3.User3Builder(type=" + this.type + ", id=" + this.id + ", remark=" + this.remark + ")";
        }
    }
}

使用:

在这里插入图片描述

3.9 @Value

与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。

详解:https://github.com/codercuixin/lombok-translate/wiki/@Value

3.10 @NonNull

该注解使用在属性上,该注解用于属的非空检查,当放在setter方法的字段上,将生成一个空检查,如果为空,则抛出NullPointerException。
该注解会默认是生成一个无参构造。

4. 其他常用注解

4.1 日志相关@Slf4j

@Slf4j使用

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LogExample {
}

以上将编译成

public class LogExample {
 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}

使用:

在这里插入图片描述

推荐使用log4j2作为日志实现,相关配置和整合:

SpringBoot系列-- SpringBoot整合SLF4j+log4j2+aop记录web请求

5.后话

lombok可以说是有利有弊,网上也有很多大佬,完整分析的利弊。个人认为用不用还是得看公司的开发规范或者你的队友用了你就被他QJ了,必须得用…(我第一次用就是队友用了,看他的代码就必须得用)

我自己平时写一些demo会用到,其他场景就看所处环境了!

不过学无止境,技术能多了解一点总是没错。不一定必须得用,但在大环境下你必须得了解过!

6. 参考文章

https://blog.csdn.net/runlion_123/article/details/105977300

https://blog.csdn.net/qq_42909053/article/details/110823133

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 基于springboot的web项目最佳实践 + [web](#web) + [单元测试](#test) + [actuator应用监控](#actuator) + [lombok](#lombok) + [baseEntity](#baseEntity) + [统一响应返回值](#result) + [异常](#exception) + [数据校验](#validation) + [日志](#log) + [swagger](#swagger) + [数据库连接池](#datasource) + [spring jdbc](#jdbc) + [jpa](#jpa) + [redis](#redis) + [spring cache](#springcache) + [mogodb](#mogodb) + [mybatis](#mybatis) + [spring security](#security) + [项目上下文](#ContextHolder) + [单点登录](#sso) + [邮件](#mail) + [maven](#maven) + [总结](#总结) `springboot` 可以说是现在做`javaweb`开发最火的技术,我在基于`springboot`搭建项目的过程,踩过不少坑,发现整合框架时并非仅仅引入`starter` 那么简单。 要做到简单,易用,扩展性更好,还需做不少二次封装,于是便写了个基于`springboot`的web项目脚手架,对一些常用的框架进行整合,并进行了简单的二次封装。 项目名`baymax`取自动画片超能陆战队里面的大白,大白是一个医护充气机器人,希望这个项目你能像大白一样贴心,可以减少你的工作量。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值