SpringBoot+Lombok使用

一、开发环境准备和新版SpringBoot2.X.X项目创建

https://spring.io/projects/spring-boot

SpringBoot+Lombok使用_第1张图片

SpringBoot+Lombok使用_第2张图片

单击Spring Initializr 在线编写:https://start.spring.io/ 

SpringBoot+Lombok使用_第3张图片

SpringBoot+Lombok使用_第4张图片

生成解压后

 

打开IDEA

SpringBoot+Lombok使用_第5张图片

 选择工程:

SpringBoot+Lombok使用_第6张图片

注意: 有些包maven下载慢,等待下载如果失败

  1. 删除本地仓库spring相关的包,重新执行 mvn install
  2. 建议先使用默认的maven仓库,不用更换地址

当前项目仓库地址修改


    
        
            maven-ali
            http://maven.aliyun.com/nexus/content/groups/public//
            
                true
            
            
                true
                always
                fail
            
        
    
        
            public
            aliyun nexus
            http://maven.aliyun.com/nexus/content/groups/public/
            
                true
            
            
                false
            
        
   

 将上面的复制到pom.xml文件中

SpringBoot+Lombok使用_第7张图片

 再重新导入包

 SpringBoot+Lombok使用_第8张图片

运行时,发生只能是8!

SpringBoot+Lombok使用_第9张图片 Pom.xml右键|Maven|Reimport

SpringBoot+Lombok使用_第10张图片

二、POJO类的提效利器Lombok插件IDEA安装

简介:讲解lombok的介绍和安装

官网:https://projectlombok.org/

2.1什么lombok

一个优秀的Java代码库,简化了Java的编码,为Java代码的精简提供了一种方式

你是否发现每个JavaBean都会写getter,setter,equals,hashCode和toString的模板代码,2.2特别的多于没技术

lombok消除Java的冗长代码,尤其是对于简单的Java对象,只要加上注解就行

2.3使用方式:项目添加依赖进行版本管理


   org.projectlombok
   lombok
   1.18.20
   
   provided

添加IDE工具对Lombok的支持

点击File-- Settings设置界面,安装Lombok插件,然后重启idea

SpringBoot+Lombok使用_第11张图片

 IDEA⾥需要在设置中启⽤annotation processors,记得重启IDEA!!!!

SpringBoot+Lombok使用_第12张图片

 三、Lombok插件玩转注解Setter/Getter实战

生成getXXX和setXXX,toString方法

public class User {
    private int id;
    private String name;
    private String email;
    private String phone;
    private Date createTime;

查看字节码

SpringBoot+Lombok使用_第13张图片

 

删除刚才生成的getXXX和setXXX,toString方法

编译查看字节码 mvn compile

SpringBoot+Lombok使用_第14张图片

在编写代码中写入注解 

 SpringBoot+Lombok使用_第15张图片

再次修改注解

SpringBoot+Lombok使用_第16张图片

 编译查看字节码 mvn compile

SpringBoot+Lombok使用_第17张图片

四、Lombok插件玩转NonNull+构造函数注解ArgsConstructor实战

@NonNull作用于方法上或者属性,用于非空判断,如果为空则抛异常

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

SpringBoot+Lombok使用_第18张图片

 编译查看字节码 mvn compile

SpringBoot+Lombok使用_第19张图片

@NoArgsConstructor 生成无参构造器

@AllArgsConstructor 生成全参构造器

SpringBoot+Lombok使用_第20张图片

 编译查看字节码 mvn compile

SpringBoot+Lombok使用_第21张图片

@RequiredArgsConstructor

指定参数的构造函数,有以下的特征的字段

final类型未被初始化的属性, 标记了@NonNull的属性

注意:@NoArgsConstructor不能加

SpringBoot+Lombok使用_第22张图片

 字节码:

SpringBoot+Lombok使用_第23张图片

五、Lombok插件原理-对比反射技术

 Lombok插件原理就是: JSR 269插件化注解处理

JSR是Java Specification Requests的缩写,意思是Java 规范提案。

是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。

任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

使用Annotation Processing自定义注解是在编译阶段进行修改

JDK的反射技术是在运行时动态修改

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

六、精通Lombok插件+Java面试核心巩固

讲解lombok的toString()注解

java bean对象为啥要重新toString方法?

  1.  List或者其他集合调试不方便
  2.  控制台或者日志输出对象,默认打印的是内存地址
User user =new User("米克");
System.out.println(user);
//显示
net.hlx.shop0907.vo.User@5caf905d

@ToString

作用于类,覆盖默认的toString()方法

SpringBoot+Lombok使用_第24张图片

字节码编译mvn compile

 User(id=0, name=米克, email=null)

不包括某个字段:@ToString(exclude = {"name"})

SpringBoot+Lombok使用_第25张图片

字节码编译mvn compile

 User(id=0, email=null)

只输出某个字段:@ToString(of = {"name"})

SpringBoot+Lombok使用_第26张图片

字节码编译mvn compile

SpringBoot+Lombok使用_第27张图片 

七、 Java核心面试题-重温hashcode和equal方法

为什么对象要重写hashcode和equal方法?

HashCode⽅法

  1.  顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值int类型
  2.  根据⼀定的hash规则(存储地址,字段,或者⻓度等),映射成⼀个数值,即散列值

Equals⽅法

  1.  顶级类Object⾥⾯的⽅法,所有类都是继承Object的,返回值boolean类型
  2.  根据⾃定义的匹配规则,⽤于匹配两个对象是否⼀样, ⼀般逻辑是如下
  1. 判断地址是否⼀样
  2. ⾮空判断和class类型判断
  3. 强转
  4. 对象⾥⾯的字段⼀⼀匹配

解析

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

如果两个对象hashCode()相等,它们并不一定相等。在散列表中hashCode()相等,即两个键值对的哈希值相等。

然而哈希值相等,并不一定能得出键值对相等,就出现所谓的哈希冲突场景,还需判断equals⽅法判断对象是否相等

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

依据hashCode和equals进⾏判断

所以Set存储的对象必须重写这两个⽅法 判断两个对象是否⼀样

⾸先判断插⼊obj的hashcode值是否存在,hashcode值不存在则直 接插⼊集合

值存在则还需判断equals⽅法判断对象是否相等

在User类中右键|

 SpringBoot+Lombok使用_第28张图片SpringBoot+Lombok使用_第29张图片SpringBoot+Lombok使用_第30张图片

SpringBoot+Lombok使用_第31张图片

SpringBoot+Lombok使用_第32张图片

八、Lombok插件玩转对象匹配EqualsAndHashCode注解

玩转lombok的EqualsAndHashCode注解

@EqualsAndHashCode

作用于类,覆盖默认的equals和hashCode, 作用于全部属性

SpringBoot+Lombok使用_第33张图片

字节码编译mvn compile

SpringBoot+Lombok使用_第34张图片

不包括某个属性:@EqualsAndHashCode(exclude = {"id",”name”})

SpringBoot+Lombok使用_第35张图片

只输出某个属性:@EqualsAndHashCode(of = {"id","name"})

SpringBoot+Lombok使用_第36张图片

测试:

SpringBoot+Lombok使用_第37张图片 

 如果编号都是1,则结果又不同:

九、玩转Lombok插件多注解集合配置Data-项目常用

@Data, 定义⼀个⼲净的类,增加此注解,mvn compile查看字节码

作⽤于类上,是以下注解的集合

@ToString

@EqualsAndHashCode

@Getter

@Setter

@RequiredArgsConstructor

十、设计模式之建造者模式和Lombok注解@Builder

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

场景:当一个bean类重载了多个构造方法时,并且参数随机使用时,考虑使用构造者模式

谷歌的开源的protobuf协议生产的java bean赋值就是采用建造者模式

@Builder注解:作用在类上

SpringBoot+Lombok使用_第38张图片

 字节码编译mvn compile

SpringBoot+Lombok使用_第39张图片

测试:

SpringBoot+Lombok使用_第40张图片

 

十一、Log日志输出打印更方便Lombok注解@Log-@Slf4j

玩转lombok的@Log日志注解

1)@Log / @Slf4j:作用于类上,生成日志变量, 用于记录日志

2)如果不生效,记得检查下面的配置,另外重新更新下lombok插件,重启idea

开始按照创建的那边,记得开启annotion processing

SpringBoot+Lombok使用_第41张图片

SpringBoot+Lombok使用_第42张图片

 字节码编译mvn compile

SpringBoot+Lombok使用_第43张图片

Lombok总结

缺点:

1)Lombok的使⽤要求⼀定要在IDE中安装对应的插件,如果项⽬组中有⼀个⼈使⽤了Lombok则都要⽤

2)代码可读性,可调试性低,⽐如想知道某个类中的某个属性的getter⽅法都被哪些类引⽤

3)影响升级,如果升级到某个新版本的JDK的时候,如果其中的特性在Lombok中不⽀持的话就会受到影响

4)注意常⻅的细节点

比如只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认是@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放,只要知道是否需要使用父类的属性即可,也提供定制化配置,所以不用过多担心

优点:

1)使用注解即可帮忙自动生成代码

2)大大减少了代码量,使代码非常简洁

3)部分注解在业务项目中开发能大大提高效率

项目中应该用还是不用呢

  1)不建议开发中间件的项目使用,中间件设计的要求是解耦少依赖

  2)业务项目实体类可以用,且用的时候知道对应的常见的注解原理

Lombok

@Setter/@Getter

@NonNull

@NoArgsConstructor

@AllArgsConstructor

@RequiredArgsConstructor

@ToString

@EqualsAndHashCode

@Data

@Builder

@Log

@Slf4j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Spring,Boot,spring,boot,spring,java)