lombok插件@NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别
准备
在使用lombok插件前需要先引入maven依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope>
</dependency>
区别
@NoArgsConstructor
:生成无参的构造方法。
@AllArgsConstructor
:生成该类下全部属性的构造方法。
@RequiredArgsConstructor
:生成该类下被final修饰或者non-null字段生成一个构造方法。
场景:
在springboot中,对于一个bean类,注入其他bean的时候,常见的是使用@Autowired
,实际上也可以使用构造函数注入,这个时候就可以使用@AllArgsConstructor
或者@RequiredArgsConstructor
来代替。
@NoArgsConstructor
用于生成无参的构造方法。
举例
添加一个实体类,在类中加上 @NoArgsConstructor
注解
package com.model;import lombok.NoArgsConstructor;@NoArgsConstructor
public class IndexModel {private String user;private Integer age;
}
生成后的class文件反编译后会有一个无参的构造函数
package com.model;public class IndexModel {private String user;private Integer age;public IndexModel() {}
}
@AllArgsConstructor
生成该类下全部属性的构造方法。
举例
同样的实体类,加上@AllArgsConstructor
注解
package com.model;import lombok.AllArgsConstructor;@AllArgsConstructor
public class IndexModel {private String user;private Integer age;
}
生成后的class文件反编译后内容如下,可以看到该类下所有属性都添加到了构造函数的参数种
package com.model;public class IndexModel {private String user;private Integer age;public IndexModel(final String user, final Integer age) {this.user = user;this.age = age;}
}
@RequiredArgsConstructor
生成该类下被final
关键字修饰或者带有@NotNull
注解的属性生成一个构造方法
#####举例
添加三个属性,一个普通属性,一个带有@NotNull注解的属性,另一个带有final关键字的属性
package com.model;import lombok.RequiredArgsConstructor;
import com.sun.istack.internal.NotNull;@RequiredArgsConstructor
public class IndexModel {private String user;@NotNullprivate Integer age;private final String email;
}
生成后的class如下,可以发现,只生成了age
和email
属性的构造参数,user
属性并未生成
package com.model;import com.sun.istack.internal.NotNull;public class IndexModel {private String user;@NotNullprivate Integer age;private final String email;public IndexModel(final Integer age, final String email) {if (age == null) {throw new NullPointerException("age is marked non-null but is null");} else {this.age = age;this.email = email;}}
}
替代 @Autowired 注解
实际开发中很多小伙伴一般会写成这种形式,使用@Autowired
注解进行注入
@RestController
@RequestMapping("api")
public class DemoController {@Autowiredprivate BlogService service;
}
用上Lombok后,我们有更简约的写法,那就是在DemoController上增加注解@AllArgsConstructor
@RestController
@RequestMapping("api")
@AllArgsConstructor
public class DemoController {private BlogService service;}
注入多个对象
@Component
@AllArgsConstructor
public class ConstructorDemo {// 注入三个bean对象,完全没有使用Autowired注解private BeanTest1 beanTest1;@NonNullprivate BeanTest2 beanTest2;private final BeanTest3 beanTest3;
}
是不是看起来更简洁了呢?