lombok保姆教学

news2024/11/27 10:21:35

初始化准备工作

所有的环境如下:

  • jdk1.8或者jdk11
  • Springboot2.x
  • mysql5.7或者mysql8.0

首先创建Springboot工程,初次创建初始化速度慢
如果想指定单个项目的maven中央仓库,pom中的配置如下:

<!-- 代码库 -->
    <repositories>
        <repository>
            <id>maven-ali</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

Lombok

Lombok简介

java工程中,我们要创建很多的java Bean。这些javaBean中都会写getter,setter,equals,hashCode和toString的模板代码,这些代码都没啥技术含量。

​ 那么我们就是使用Lombok来自动生成这些代码,通过注解的方式。提高我们的工作效率。

​ Lombok的原理:JSR 269插件化注解处理。就是在编译生成字节码之前,Lombok根据自己编写的注解处理器,动态地修改 AST增加新的节点(即Lombok自定义注解所需要生成的代码),最终生成JVM可执行的字节码Class文件。

​ 什么是JSR 269?
JSR 269: Pluggable Annotation Processing API
实现在Javac编译阶段利用“Annotation Processor”对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件

  • java反射技术的对比
    • 使用Annotation Processing自定义注解是在编译阶段进行修改
    • JDK的反射技术是在运行时动态修改

结论:反射更加灵活一些但是带来的性能损耗更加大

安装

  • 安装插件。在idea工具中安装Lombok插件,安装完成后重启idea
  • 添加依赖
 <!--scope=provided,说明它只在编译阶段生效,不需要打入包中, Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>

开启 annotation processing,重启idea
在这里插入图片描述

@getter和@setter注解

  • 作用
    • 生成对应的getter和setter方法
  • 使用方法
    • 写在对应的属性上,生成此属性的getter和setter
    • 写在类上,生成所有属性的getter和setter
    • 方法控制访问级别 set和get注解加上 @Getter(AccessLevel.PROTECTED)
    • 不想生成set、get方法@Getter(AccessLevel.NONE)
    • 常量(final)只生成getter
    • 静态变量不生成getter和setter
  • 代码如下
    具体效果可以先compile,然后在idea中查看对应的字节码文件。
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter
@Setter
public class User {

    // 生成私有的getter
    @Getter(AccessLevel.PRIVATE)
    private int id;

    // 不生成setter
    @Setter(AccessLevel.NONE)
    private String username;

    private String pwd;

    private String phone;

    private String email;

    private Date createTime;

    // final 没有setter
    private final String status = "启动";

    // static 没有getter和setter
    private static String address = "河南洛阳";

}

@NonNull注解

  • 作用:作用于方法上或者属性,用于非空判断,如果为空则抛异常
  • 代码
	@NonNull
    private String pwd;

	public void login(@NonNull String pwd){
        System.out.println("登录");
    }

构造方法相关注解

  • @NoArgsConstructor
    • 生成无参构造器
  • @AllArgsConstructor
    • 生成全参构造器
    • final和static属性不生成
  • @RequiredArgsConstructor
    • 指定参数的构造函数,有以下的特征的字段
      • final类型未被初始化的属性, 标记了@NonNull的属性
      • 标记了@NonNull的属性
    • 注意:自定义的构造函数不要冲突,主要是类型
    • 理解此注解,需要结合final关键字的含义
    • @NoArgsConstructor不能加

@ToString注解

  • 作用:重写toString方法,方便调试。
  • 使用:写在类名上
    • 默认输出所有属性
    • 不包含某个属性
    • 只输入指定属性
//不包含某个属性
@ToString(exclude = {"age"})
//只输入指定属性
@ToString(of = {"name"})

@EqualsAndHashCode注解

作用:@EqualsAndHashCode注解可以重写对象的HashCode方法和equals方法
我们先来了解下这两个方法:

  • HashCode⽅法
    • 顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值int类型
    • 根据⼀定的hash规则(存储地址,字段,或者⻓度等),映射成⼀个数值,即散列值
  • Equals⽅法
    • 顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值boolean类型
    • 根据⾃定义的匹配规则,⽤于匹配两个对象是否⼀样, ⼀般逻辑是如下
   //判断地址是否⼀样
  //⾮空判断和class类型判断
  //强转
  //对象⾥⾯的字段⼀⼀匹配

那为什么要对比这么多内容?

如果两个对象相等,那么它们的hashCode()值一定相同(这里的相等是指,通过equals()比较两个对象时返回true)

如果两个对象hashCode()相等,它们并不一定相等。在散列表中hashCode()相等,即两个键值对的哈希值相等。
然而哈希值相等,并不一定能得出键值对相等,就出现所谓的哈希冲突场景,还需判断equals⽅法判断对象是否相

应用场景:

​ 当向集合中插⼊对象时,如何判别在集合中是否已经存在该对象,⽐如Set确保存储对象的 唯⼀,并判断是不是同个对象呢?

依据hashCode和equals进⾏判断
所以Set存储的对象必须重写这两个⽅法 判断两个对象是否⼀样
⾸先判断插⼊obj的hashcode值是否存在,hashcode值不存在则直 接插⼊集合
值存在则还需判断equals⽅法判断对象是否相等

接下来看一段代码:

 Set<User> set = new HashSet<>();
        User u1 = new User("123456");
        User u2 = new User("123456");
        System.out.println(u1==u2); // 返回false,在内存中的地址是不一样的
        set.add(u1);
        set.add(u2);
        System.out.println(set.size()); // 长度为2,表示两个都添加成功

然后在User中添加@EqualsAndHashCode注解,还是运行上面的代码,发现长度为1。

使用:

  • 作用于类,覆盖默认的equals和hashCode, 作用于全部属性
  • 不包括某个属性
@EqualsAndHashCode(exclude = {"age"})
  • 只输出某个属性
@EqualsAndHashCode(of = {"name"})

@Data注解

Lombok前面讲了多个注解,一个个加也麻烦

  • @Data, 定义一个干净的类,增加此注解,mvn compile查看字节码
  • 作用于类上,是以下注解的集合
    • @ToString
    • @EqualsAndHashCode
    • @Getter
    • @Setter
    • @RequiredArgsConstructor

@Builder注解

构造者模式:又称之为建造者模式

  • 场景:当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式
  • 代码
@Data
@Builder
public class Student {
    private int id;

    private String username;

    private String pwd="";

    private final String phone="";

    private String email;

    private Date createTime;

    // final 没有setter
    private final String status = "启动";

    // static 没有getter和setter
    private static String address = "河南洛阳";
}
Student student = Student.builder().id(123).pwd("1").username("张三").build();

@Log和@Slf4j注解

  • @Log / @Slf4j
    • 作用于类上,生成日志变量, 用于记录日志
  • 如果不生效,记得检查下面的配置,另外重新更新下lombok插件,重启idea
    • 开始按照创建的那边,记得开启 开启annotion processing
  • 使用
@Slf4j
public class StudentDO {
    public void test(String email){

        log.info("test方法测试");
        this.email = email;
    }
}

//字节码
public class StudentDO {
    private static final Logger log = Logger.getLogger(StudentDO.class.getName());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF学习(一):SQL注入,万能密码

1、场景 2、题目 3、解题 用户名&#xff1a;admin or 11# 密码&#xff1a;123456 4、解析SQL注入 “SQL注入是一种常见的Web应用程序漏洞&#xff0c;攻击者可以通过注入的SQL语句获取数据库的敏感信息&#xff0c;对网站用户的数据安全造成威胁。SQL注入的特点包括广泛性、隐…

如何将领导发的jar包安装到本地的maven仓库

第一步&#xff1a;打开idea右侧的maven功能选择这个图标 第二步&#xff1a;输入maven指令 这个的pom文件的maven管理 1.这个是同一个文件夹下面导入两个jar包。如jdk16和javadoc mvn install:install-file -DfileD:\java\maven\myDepot\aspose-words-16.8.0-jdk16.jar -D…

websocket+node+vite(vue)实现一个简单的聊天

1.前端逻辑 本项目基于之前搭建的vite环境&#xff1a;https://blog.csdn.net/beekim/article/details/128083106?spm1001.2014.3001.5501 新增一个登录页和聊天室页面 <template><div>登录页</div><div>用户名:<input type"text" pl…

uniapp开发H5微信公众号,使用微信的扫一扫等Api试错

记录使用uniapp开发H5微信公众号,有些业务需要用到一些API&#xff0c;比如扫码&#xff0c;h5和微信小程序&#xff0c;app在使用过程中有有些不同&#xff0c;h5使用需要单独引入微信的jsdk,才能使用否则会报错无法使用 引入微信jsdk npm安装 npm install jweixin-module -…

一款优秀的文件外发控制软件 具备哪些优势?

随着越来越多的公司在网上开展业务&#xff0c;网络安全漏洞也相应增加。因此&#xff0c;企业需要保护自己的数据&#xff0c;防止数据泄露&#xff0c;给企业带来损失。近几年来&#xff0c;企业数据泄露事件频发&#xff0c;给许多企业都带来巨大创伤。 乌克兰电力公司在201…

【python入门篇】元组、字典和集合(3)

先来介绍下这三种数据类型&#xff0c;第一个&#xff1a;元组&#xff08;tuple&#xff09;是 python中另一个重要的序列结构&#xff0c;和列表类似&#xff0c;元组也是由一系列按特定顺序排序的元素组成。第二个&#xff1a;python 字典&#xff08;dict&#xff09;是一种…

AIGC|数字时代巨变,创新潮流涌现,万亿市值风口已开!

“2021年至2023年7月期间&#xff0c;AIGC赛道共发生280笔投融资&#xff0c;展现了其高热度与高成长性。在获投的应用与模型层创业项目中&#xff0c;文本、影像、语音平分秋色。”艾瑞咨询在其《2023年中国AIGC产业全景报告》披露国内AIGC的最新投融资情况&#xff0c;这让我…

关于IOC与IOA的学习

[TOC]IOC与IOA学习 IoC 和 IoA&#xff1a;两者有什么区别&#xff1f; IoC 和 IoA 可通过以下四种简单的方法进行区分&#xff1a; 具体工具与动机&#xff1a; IoC 专注于攻击者为实现其意图而使用的特定文件和采取的行动&#xff0c;而 IoA 则专注于这些意图本身。IoC 关…

QT 串口编程 QSerialPort

//创建串口对象QSerialPort s new QSerialPort("/dev/ttySAC2", this);//配置串口信息s->setBaudRate(QSerialPort::Baud9600);//波特率s->setDataBits(QSerialPort::Data8);//数据位s->setStopBits(QSerialPort::OneStop);//奇偶校验s->setParity(QSer…

《向量数据库指南》——Milvus Cloud向量数据库的优势

大禹智库: 随着大模型的爆火,向量数据库也越发成为开发者关注的焦点。为了方便大家更好地了解向量数据库,我们特地推出了《Hello, VectorDB》系列,本文将从宏观角度、向量数据库与其他算法库的区别、技术难点及如何选择向量数据库等方面,带大家认识真正的向量数据库。 在…

simulink创建全局变量MATLAB function引用

matlab版本&#xff1a;2022a 在库浏览器中找到Data Store Memory并放置 双击打开Data Store Memory模块设置变量名 在信号属性中设置初始值、数据类型和信号类型&#xff0c;数据类型和信号类型不能为auto 在记录中勾选“记录数据存储数据” 打开引用该变量的MATLAB function模…

数字时代,VR虚拟展会打造全渠道同步营销新模式

随着经济的快速发展&#xff0c;VR虚拟展会逐步完善&#xff0c;对线下实体展会也产生了重大的影响&#xff0c;在这个数字化时代&#xff0c;展会展览也需要寻找新的表达方式&#xff0c;VR虚拟展会以一种全新的魅力吸引越来越多的观展者。 传统展厅的局限性&#xff1b; 1、…

更新 | 持续开源迅为RK3568驱动指南-驱动基础进阶篇

《iTOP-RK3568开发板驱动开发指南》更新&#xff0c;本次更新内容对应的是驱动&#xff08;第一期_驱动基础-进阶篇&#xff09;视频&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 文档教程更新至驱动基础进…

安捷伦N8482A射频传感器6GHz

安捷伦N8482A射频传感器 N8482A 是 Agilent 使用的 6 GHz 0.1 瓦射频传感器。电子测试设备传感器测量波形的功率&#xff0c;例如多音和调制射频 (RF) 波形。传感器使用二极管检测器收集高度精确的调制测量值。 用于存储校准系数的 EEPROM 消除了手动输入 100 kHz 至 6 GHz 的宽…

java-范型

java—范型 泛型在java中有很重要的地位&#xff0c;无论是开源框架还是JDK源码都能看到它。 毫不夸张的说&#xff0c;泛型是通用设计上必不可少的元素&#xff0c;所以真正理解与正确使用泛型&#xff0c;是一门必修课。 1&#xff0c;范型概述 1&#xff0c;泛型本质 J…

linux中运行springboot jar包,内存占用多运行时报错

错误&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000794500000, 576716800, 0) failed; 重启程序后过两天还会内存不够 通过top查询内存使用情况&#xff0c;发现占用物理内存1g 目前因为启动多个服务&#xff0c;每个服务默认分配…

sql优化常用

1、explain 输出执行计划 在select语句前加上explain就可以了(MySQL 5.6开始&#xff0c;不仅仅支持select )能够简单分析sql的执行情况&#xff0c;是否走索引等。 type列&#xff0c;连接类型。一个好的SQL语句至少要达到range级别。从最好到最差的连接类型为const、eq_reg、…

无线通信——Mesh体系结构

Mesh体系结构 了解Mesh的体系结构有利于我们后期的理解&#xff01;这里有些简单的知识点以及解释 WMN&#xff1a;WMN就是无线mesh网络&#xff0c;我们一般提到WMN其实特指就是Mesh网络的整个体系结构 STA&#xff1a;客户工作站&#xff0c;这个东西就是用户的设备端&…

OAuth2 refreshToken时只获取到用户名的问题解决

1. grant_type为refresh_token时, authentication.getPrincipal()只获取到了字符串类型的用户名(这种情况下生成的access_token是没有权限的,访问不了正常的有权限校验的接口) , 跟踪源码发现 是 DefaultUserAuthenticationConverter#extractAuthentication中的userDetailsSer…

精密空调别再这样管理了,太麻烦啦!

在现代生活中&#xff0c;空调系统已经成为不可或缺的一部分&#xff0c;特别是在高温季节。然而&#xff0c;空调系统的有效性和效率对于节能、环保和用户舒适性至关重要。为了更好地满足这些需求&#xff0c;精密空调监控系统应运而生。 精密空调监控系统结合了先进的技术&am…