lombok插件@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别

发布时间:2022-07-19 15:26:01 作者:yexindonglai@163.com 阅读(2026)

准备

在使用lombok插件前需要先引入maven依赖

  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.20</version>
  5. <scope>provided</scope>
  6. </dependency>

区别

@NoArgsConstructor:生成无参的构造方法。
@AllArgsConstructor:生成该类下全部属性的构造方法。
@RequiredArgsConstructor:生成该类下被final修饰或者non-null字段生成一个构造方法。
场景:
在springboot中,对于一个bean类,注入其他bean的时候,常见的是使用@Autowired,实际上也可以使用构造函数注入,这个时候就可以使用@AllArgsConstructor或者@RequiredArgsConstructor来代替。

@NoArgsConstructor

用于生成无参的构造方法。

举例

添加一个实体类,在类中加上 @NoArgsConstructor注解

  1. package com.model;
  2. import lombok.NoArgsConstructor;
  3. @NoArgsConstructor
  4. public class IndexModel {
  5. private String user;
  6. private Integer age;
  7. }

生成后的class文件反编译后会有一个无参的构造函数

  1. package com.model;
  2. public class IndexModel {
  3. private String user;
  4. private Integer age;
  5. public IndexModel() {
  6. }
  7. }

@AllArgsConstructor

生成该类下全部属性的构造方法。

举例

同样的实体类,加上@AllArgsConstructor注解

  1. package com.model;
  2. import lombok.AllArgsConstructor;
  3. @AllArgsConstructor
  4. public class IndexModel {
  5. private String user;
  6. private Integer age;
  7. }

生成后的class文件反编译后内容如下,可以看到该类下所有属性都添加到了构造函数的参数种

  1. package com.model;
  2. public class IndexModel {
  3. private String user;
  4. private Integer age;
  5. public IndexModel(final String user, final Integer age) {
  6. this.user = user;
  7. this.age = age;
  8. }
  9. }

@RequiredArgsConstructor

生成该类下被final关键字修饰或者带有@NotNull注解的属性生成一个构造方法

举例

添加三个属性,一个普通属性,一个带有@NotNull注解的属性,另一个带有final关键字的属性

  1. package com.model;
  2. import lombok.RequiredArgsConstructor;
  3. import com.sun.istack.internal.NotNull;
  4. @RequiredArgsConstructor
  5. public class IndexModel {
  6. private String user;
  7. @NotNull
  8. private Integer age;
  9. private final String email;
  10. }

生成后的class如下,可以发现,只生成了ageemail属性的构造参数,user属性并未生成

  1. package com.model;
  2. import com.sun.istack.internal.NotNull;
  3. public class IndexModel {
  4. private String user;
  5. @NotNull
  6. private Integer age;
  7. private final String email;
  8. public IndexModel(final Integer age, final String email) {
  9. if (age == null) {
  10. throw new NullPointerException("age is marked non-null but is null");
  11. } else {
  12. this.age = age;
  13. this.email = email;
  14. }
  15. }
  16. }

替代 @Autowired 注解

实际开发中很多小伙伴一般会写成这种形式,使用@Autowired注解进行注入

  1. @RestController
  2. @RequestMapping("api")
  3. public class DemoController {
  4. @Autowired
  5. private BlogService service;
  6. }

用上Lombok后,我们有更简约的写法,那就是在DemoController上增加注解@AllArgsConstructor

  1. @RestController
  2. @RequestMapping("api")
  3. @AllArgsConstructor
  4. public class DemoController {
  5. private BlogService service;
  6. }

注入多个对象

  1. @Component
  2. @AllArgsConstructor
  3. public class ConstructorDemo {
  4. // 注入三个bean对象,完全没有使用Autowired注解
  5. private BeanTest1 beanTest1;
  6. @NonNull
  7. private BeanTest2 beanTest2;
  8. private final BeanTest3 beanTest3;
  9. }

是不是看起来更简洁了呢?

关键字Spring