【学习Day4】lombok有哪些注解以及使用场景

发布于:2022-10-16 ⋅ 阅读:(603) ⋅ 点赞:(0)

目录

​编辑

一、什么是lombok?

二、lombok常用注解?

2.1、@Setter/@Getter

2.1.1、注解参数

2.1.2、使用

2.1.3、应用场景

2.2、@Data

2.2.1、注解参数

 2.2.2、使用

2.3.3、应用场景

2.4、@AllArgsConstructor

2.4.1、注解参数

2.4.2、使用

2.4.3、使用场景

2.5、@NoArgsConstructor

2.5.1、注解参数

2.5.2、使用

2.5.3、使用场景

2.6、@Builder

2.6.1、注解参数

2.6.2、使用

2.6.3、应用场景

2.7、@ToString

2.7.1、注解参数

 2.7.2、使用

 2.7.3、使用场景

2.8、@EqualsAndHashCode

2.8.1、注解参数

 2.8.2、使用

 2.8.3、使用场景

2.9、@RequiredArgsConstructor

2.9.1、注解参数

2.9.2、使用

 2.9.3、使用场景

注意:

2.10、@var

2.10.1、使用

1.10.2、优缺点

 1.10.3、使用场景

2.11、@Accessors

2.11.1、注解参数

 2.11.2、使用

 2.11.3、使用场景

2.11.4、@Accessors与@Builder的区别

注意:

2.12、@Slf4j

2.12.1、注解参数

2.12.2、使用

 2.12.3、使用场景

@Retention(了解)

知识点

未完


一、什么是lombok?

是一个自动生成代码的插件,下面为lombok1.18.16源码

二、lombok常用注解?

  1. @Setter
  2. @Getter
  3. @Data
  4. @AllArgsConstructor
  5. @NoArgsConstructor
  6. @Builder
  7. @ToString
  8. @EqualsAndHashCode
  9. @RequiredArgsConstructor
  10. @var
  11. @Accessors
  12. @slf4j

2.1、@Setter/@Getter

  • 放在类上面:把类中所有字段生成Setter/Getter方法
  • 放在方法上面:只会生成此字段的Setter/Getter方法

2.1.1、注解参数

通过源码可知Getter注解有三个参数

  • value 表示生成的方法的访问权限,默认为public,注解的值需要一个AccessLevel枚举类型,如果想生成一个private的get方法,如下图所示:

 AccessLevel枚举有六个可选值

  1. none 表示不生成
  2. public 所有类都可以访问
  3. private 只能本类可以访问
  4. module--------------------
  5. protected 同包下或子类
  6. package 在同一个包下可以访问
  • onMethod 表示列出的所有注解都放在方法上 写法为 onMethod_ = {@NonNull}
  • lazy 表示延迟加载,只有用到这个字段的时候才会赋值,并且这个字段必须是private和final修饰还要初始化值

 通过源码可知setter的参数也有三个对比getter少了一个lazy多了一个onParma参数

  •  onParma 表示列出的所有注解都放在参数上 写法为 onParam_ = {@NonNull}

2.1.2、使用

默认我们新建一个Java类定义几个属性,其结构如下:

 在类上加Setter/Getter,其结构如下:

 注意:在字段使用上面已有例子,对于boolean型的字段,生成get方法的时候它会使用is来代替get

2.1.3、应用场景

1.针对某个字段生成Setter/Getter

2.这个类中的所有字段只生成Setter/Getter

3.生成Setter/Getter的时候需要改变访问权限

2.2、@Data

  • 作用在类上面,其包含@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode五个注解

2.2.1、注解参数

通过源码可知它只有一个参数

  • staticConstructor 生成一个私有的构造并且在生成一个静态的方法应用于构造对象

 2.2.2、使用

在类上面加@Data注解,并且指定staticConstructor 参数其结构如下:

在使用的时候就不能new了必须调用它的静态方法来获取对象

不指定参数的结构如下:

使用的时候和正常一样直接new就可以 

2.3.3、应用场景

1.生成get/set、无参构造、toStrong、hasCode等方法 直接用Data注解更加方便

2.4、@AllArgsConstructor

  • 只能作用在类上 

2.4.1、注解参数

通过源码可知此注解有三个参数

  •  staticName 和Data注解的用法一样,生成一个私有构造,并且在生成一个静态的方法来构建对象
  • onConstructor 和Getter注解onMethod参数一样,把传入的注解生成到构造方法上
  • access 和Setter的value方法一样,用于控制访问

2.4.2、使用

  不添加参数的结构      

 添加参数的结构

 注意:AllArgsConstructor注解会顶掉Java默认的无参构造,所以此注解要与NoArgsConstructor注解一起使用

2.4.3、使用场景

1.只生成全参构造的时候

2.使用@Data注解,缺少全参构造的时候,切记会把无参构造顶没

2.5、@NoArgsConstructor

  • 作用在类上面

2.5.1、注解参数

通过源码可知此注解参数与AllArgsConstructor基本相同,多了一个force参数

  •  force ---------------------------------

2.5.2、使用

2.5.3、使用场景

1.通常与@AllArgsConstructor注解连用

2.6、@Builder

  • 可以作用在类、方法、构造函数上,其设计模式为建造者模式

2.6.1、注解参数

由源码可知一共有六个参数,两个内部注解

  • builderMethodName 修改builder方法名 默认为builder
  • buildMethodName 修改build的方法名称 默认为build
  • builderClassName 修改builderClass类名 
  • toBuilder -----------------------------------------
  • access 控制访问权限,等同于Getter的value用法
  • setterPrefix 添加构建方法的前缀

2.6.2、使用

不加任何参数

 它会生成一个私有的全参构造器,一个静态内部类,和一个静态方法返回这个内部类

 加上builderMethodName 、buildMethodName、builderClassName其使用如下


加上setterPrefix属性

2.6.3、应用场景

1.用于构建对象的时候使用,可以简化代码

2.7、@ToString

  • 作用在类上

2.7.1、注解参数

通过源码可知一共有6个参数和两个内部注解

  • includeFieldNames 表示生成的时候是否包含属性名称,默认为true
  • exclude 排除某个字段,如果要排除多个字段,用逗号分隔
  • of ----------------------------------------------------------
  • callSuper 把父类的toString和本类的toString方法合并
  • doNotUseGetters 如果为true 直接访问字段而不是使用
  • onlyExplicitlyIncluded 表示是否包含全部字段,默认为false,表示包含所有字段,通常与@ToString.Include注解连用,如果onlyExplicitlyIncluded为true的时候不不含任何字段,通过@ToString.Include来指定要包含的字段,此注解要作用在字段上,并且有一个参数为name,它可以替换生成toString字段的名称

 2.7.2、使用

includeFieldNames 为true 显示字段名称

includeFieldNames 为false不显示字段名称

 exclude排除多个字段

 callSuper合并父类的Tostring方法

 onlyExplicitlyIncluded在使用的时候不可以包含exclude和Include 注解,会报

java: The old-style 'exclude/of' parameter cannot be used together with the new-style @Include / @Exclude annotations.

 注意:它所以报错是因为onlyExplicitlyIncluded注解表示是否生成所有字段,如果为false的什么字段都没有,在去移除就会找不到就会出现错误

 

 去掉Exclude正常了

 2.7.3、使用场景

1.@Data注解生成toString方法不满足需要的时候使用

2.8、@EqualsAndHashCode

  • 作用在类上面

2.8.1、注解参数

通过源码可知它有七个参数,两个内部注解

下面只讨论一个参数

  • callSuper  true调用父类的equals和hashcode方法,false不调用,默认为false,这个参数只有存在继承关系下才可以使用,否则编译报错

 2.8.2、使用

情况描述:有一个学生类,一个sex属性作为父类,一个用户类继承学生类,分别给属性赋值,然后比较他们的值是否相等。

 通过代码运行发现执行的结果不是我们想要的,因为父类的sex字段的值不相等,应为为false才对,之所以出现这种情况,是因为@Data注解包含EqualsAndHashCode,并且@EqualsAndHashCode注解callsuper参数默认为false,这个参数如果为false,说明不会调用父类的equals和hashcode方法,也就是说在子类生成Hashcode的时候没把父类的字段计算进去,就导致在比较的时候只比较子类中的字段是否相等,解决方法通过手动添加@EqualsAndHashCode(callSuper=true)就可以解决问题,配置这个参数表示在子类生成HashCode的时候,会把父类的属性加进去。

 

 2.8.3、使用场景

解决存在继承关系的对象比较,前提是用 了@Data注解来生成代码

2.9、@RequiredArgsConstructor

  • 作用在类上面

2.9.1、注解参数

通过源码可知它有三个参数

  • staticName 生成一个静态
  • onConstructor 在构造上加某些注解
  • access 访问权限控制

2.9.2、使用

 2.9.3、使用场景

可以通过@RequiredArgsConstructor代替@Autowired 和@resource来实现bean的注入,采用的是构造器的注入,对于一个类有多个注入的场景极度友好


@RestController
public class TestController {

    @Autowired
    private TestService testService;

    @RequestMapping("/test")
    public String test(){
        return testService.show();
    }
}


//==================相当于下面的代码=================================//

@RequiredArgsConstructor
@RestController
public class TestController {

 
    final TestService testService;

    @RequestMapping("/test")
    public String test(){
        return testService.show();
    }
}

注意:

使用 @RequiredArgsConstructor注解来注入bean的时候,必须把bean定义为final

2.10、@var

  • 用于声明局部变量的类型

2.10.1、使用

 它可以自动推断出定义的类型

1.10.2、优缺点

优点:

  • 可以写很少的代码来定义类型
  • 调整代码返回值可以减少改动

缺点:

  • 不能明确得知道返回的类型

 1.10.3、使用场景

建议在一些final修饰的字段上用或者不在赋值的类型,你可以不用知道它是什么类型,只需要对它进行判断即可

2.11、@Accessors

  • 作用于类和字段上

2.11.1、注解参数

由源码可知一共三个参数

  • fluent 去掉get方法的前缀进行链式调用 默认为false
  • chain 采用原生的方法名进行链式调用 默认为false
  • prefix ---------------------------

 2.11.2、使用

添加fluent、chain参数效果如下

 2.11.3、使用场景

用于构建对象

2.11.4、@Accessors与@Builder的区别

  • @Accessors代码少只是生成一些方法 @Builder 会生成一个类
  • @Accessors的链式调用 比@Builder更加简洁,少了builder 和build方法

注意:

Accessors的set方法带有返回值

2.12、@Slf4j

  • 作用在类上

2.12.1、注解参数

通过源码可知它只有一个参数

  • topic 同于打印日志的名称,其作用与lombok配置有关(待了解)

2.12.2、使用

不配置topic

配置topic

 2.12.3、使用场景

用于打印日志

@Retention(了解)

此注解作用在lombok的所有注解上,其作用是保留注解到什么阶段,我们拿@Data来看

它的值是一个枚举类型,其枚举类中有三个值,source(源码中也就是.java文件中)、 class(编译后的字节码中)、runtime(运行中)。所有的lombok中配置的值为源码中,也就说只能在Java文件中看见,在编译后的.class文件中是看不见的

源码和编译后对比

 

知识点

  • lombok常用注解

未完


网站公告

今日签到

点亮在社区的每一天
去签到