Lombok注解记录

@Setter

自动添加类中所有属性相关的 set() 方法

@Getter

自动添加类中所有属性相关的 get() 方法

@Builder

使得该类可以通过 builder(建造者模式)构建对象

1
Student.builder().sno("001").sname("admin").sage(18).sphone("110").build();

@RequiredArgsConstructor

生成一个该类的构造方法,禁止无参构造

@ToString

重写该类的 toString() 方法

@EqualsAndHashCode

重写该类的 equals() 和 hashCode() 方法

callSuper = true

根据(子类自身的字段值 + 从父类继承的字段值)生成 hashcode

当两个子类对象比较时,如果生成的 hashcode 相同,equals() 返回 true。

callSuper = false

根据(子类自身的字段值)生成 hashcode

当两个子类对象比较时,如果只有子类对象的本身的字段值相同,equals() 就返回 true(父类字段值可以不同)

@Data

= @Setter + @Getter + @RequiredArgsConstructor + @ToString + @EqualsAndHashCode

@Data 默认比较两个对象的 hashCode,需要依据业务要求显式重写 equals() 方法,或者类上加上注解:@EqualsAndHashCode(onlyExplicitlyIncluded = true),然后为每一个需要比较的属性加上注解:@EqualsAndHashCode.Include

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import lombok.Data;
import lombok.EqualsAndHashCode;

@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
public class Cs {
private int id;
@EqualsAndHashCode.Include
private String name;

public Cs(int id, String name) {
this.id = id;
this.name = name;
}
}

@NoArgsConstructor

生成无参的构造方法。

staticName

staticName 代表的是是否生成静态构造方法,也就是说当 staticName 属性有值时则会生成一个静态构造方法,这时无参构造方法会被私有,然后创建一个指定名称的静态构造方法,并且是公有的,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
* 编译前代码
*/
@RequiredArgsConstructor(staticName = "UserStatic")
public class UserInfo() {

private String username;
private String password;
}

/**
* 编译后代码
*/
public class UserInfo() {

private String username;
private String password;

private UserInfo() {
}

public UserStatic() {
return new UserStatic();
}
}

onConstructor

经常写 Spring 或者 SpringBoot 代码的人应该知道,Spring 对于依赖注入提供了三种写法,分别是属性注入、Setter 方法注入以及构造器注入,但是在日常工作中我们更多采用的是依赖于 @Autowired 注解方式进行依赖注入,不过过多的依赖注入会使我们的代码过于冗长,甚至 Spring4.0 起就已经开始不推荐这种写法了,而是推荐使用 Setter 方法注入以及构造器注入,lombok 的生成构造器的方法就可以很方便的实现这种写法。

举一个通过构造器注入的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Controller
public class SysLoginController() {

private final TokenUtils tokenUtils;

private final SysLoginService sysLoginService;

/**
* 在这里 @Autowired 是可以省略的,在这里使用只是为了介绍 onConstructor 参数
*/
@Autowired
public SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {

this.tokenUtils = tokenUtils;
this.sysLoginService = sysLoginService;
}
}

这样注入 Bean 在数量较多时我们仍需编写大量代码,这个时候就可以使用 @RequiredArgsConstructor 注解来解决这个问题,至于为什么不使用 @AllArgsConstructor 注解是因为这个注解是针对所有参数的,而在这个情境下,我们只需构造 Bean 所对应的属性而不是非 Bean,所以我们只需在 Bean 对应的属性前加上 final 关键字进行修饰就可以只生成需要的有参构造函数,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 编译前
*/
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class SysLoginController() {

private final TokenUtils tokenUtils;

private final SysLoginService sysLoginService;
}

/**
* 编译后
*/
public class SysLoginController() {

private final TokenUtils tokenUtils;

private final SysLoginService sysLoginService;

@Autowired
public SysLoginController (TokenUtils tokenUtils, SysLoginService sysLoginService) {

this.tokenUtils = tokenUtils;
this.sysLoginService = sysLoginService;
}
}

access

有的时候我们会使用单例模式,这个时候需要我们创造一个私有的无参构造方法,那么就可以使用 access 这样一个属性来设置构造起的权限,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* 编译前代码
*/
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class UserInfo() {

private String username;
private String password;
}

/**
* 编译后代码
*/
public class UserInfo() {

private String username;
private String password;

private UserInfo() {
}
}

access 可选等级:

1
2
3
4
5
6
7
8
9
10
11
public enum AccessLevel {
PUBLIC,
MODULE,
PROTECTED,
PACKAGE,
PRIVATE,
NONE;

private AccessLevel() {
}
}

force

当类中有被 final 关键字修饰的字段未被初始化时,编译器会报错,这时也可以设置 force 属性为 true 来为字段根据类型生成一个默认值 0/false/null,这样编译器就不会再报错了,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 编译前代码
*/
@RequiredArgsConstructor(force = true)
public class UserInfo() {

private final String gender;
private String username;
private String password;
}

/**
* 编译后代码
*/
public class UserInfo() {

private final String gender = null;
private String username;
private String password;

private UserInfo() {
}
}

@AllArgsConstructor

生成全参的构造方法。





  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 Liangxj
  • 访问人数: | 浏览次数: