spring-boot - 为什么在实体上同时使用@AllArgsConstructor 和@NoArgsConstructor?
问题描述
我在 IntelliJ 中的 Spring Boot 应用程序上在线看到了多个代码,许多代码同时使用两者@AllArgsConstructor
,@NoArgsConstructor
并且两者都是构造函数,但是每个代码的目的是不同的 -
@AllArgsConstructor
为带注释的类中的每个字段生成一个需要参数的构造函数@NoArgsConstructor
生成一个没有参数的构造函数
那么为什么我们在同一个实体上同时使用两者,在这种情况下它们是如何运作的呢?
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Product {
@Id
private int id;
private String name;
private String type;
}
解决方案
这些是来自 Lombok 的注释。要了解为什么需要它,您必须了解事情在内部是如何工作的。
JPA 说它
的规范说“ JPA 规范要求所有持久类都有一个无参数构造函数。这个构造函数可能是公共的或受保护的。因为当没有定义其他构造函数时,编译器会自动创建一个默认的无参数构造函数,只有类定义构造函数还必须包含一个无参数构造函数。 "
为了进一步理解,当它使用反射创建实体时,它使用Class.newInstance()方法,该方法需要无参数构造函数来创建实例。
Spring 最常用的依赖注入类型是
- 基于构造函数的注入
- 基于 Setter 的注入
基于构造函数的注入: 当您通过传递所有参数创建对象时,您基本上使用构造函数注入。当我们拥有所有参数值并且我们想要创建一个所有值都已初始化的对象时,应该这样做。(@AllArgsConstructor)
基于 Setter 的注入:我们首先创建一个对象(不使用 arg-constructor),然后使用 setter 更新依赖项或值。(@NoArgsConstructor)
构造函数注入和 setter 注入之间有许多关键区别。
部分依赖:可以使用 setter 注入,但不能通过构造函数注入。假设一个类中有 3 个属性,有 3 个 arg 构造函数和 setter 方法。在这种情况下,如果您只想传递一个属性的信息,则只能通过 setter 方法。
覆盖: Setter 注入覆盖了构造函数注入。如果我们同时使用构造函数和 setter 注入,IOC 容器将使用 setter 注入。
更改:我们可以通过 setter 注入轻松更改值。它不会像构造函数一样创建新的 bean 实例。所以 setter 注入比构造函数注入更灵活。
推荐阅读
- python - 另一个模式中的 Django 外键
- python - 字典中包含的列表的顺序会有所不同吗?
- html - 父 div 为相对,子 div 为绝对,但仍然定位不工作
- android - 如何从我的应用程序启动桌面网站?
- android - Nexus 3:一组的两个不同存储库中的一个工件的版本冲突
- html - 将所有 CSS 链接重新组合在一行中
- php - 使用 curl 上传文件后 ftp_size 返回 -1
- python - 当它具有文件访问权限时,为 python 执行 cron 作业失败
- angularjs - Kendo Grid 服务器端过滤将 null 作为过滤器对象发送到后端
- spring-boot - 使用 apache commons cli 无法识别的选项