目录
一、什么是lombok?
是一个自动生成代码的插件,下面为lombok1.18.16源码
二、lombok常用注解?
- @Setter
- @Getter
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- @Builder
- @ToString
- @EqualsAndHashCode
- @RequiredArgsConstructor
- @var
- @Accessors
- @slf4j
2.1、@Setter/@Getter
- 放在类上面:把类中所有字段生成Setter/Getter方法
- 放在方法上面:只会生成此字段的Setter/Getter方法
2.1.1、注解参数
通过源码可知Getter注解有三个参数
- value 表示生成的方法的访问权限,默认为public,注解的值需要一个AccessLevel枚举类型,如果想生成一个private的get方法,如下图所示:
AccessLevel枚举有六个可选值
- none 表示不生成
- public 所有类都可以访问
- private 只能本类可以访问
- module--------------------
- protected 同包下或子类
- 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常用注解