准备
在使用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;
@NotNull
private 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;
@NotNull
private 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 {
@Autowired
private 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;
@NonNull
private BeanTest2 beanTest2;
private final BeanTest3 beanTest3;
}
是不是看起来更简洁了呢?