首页 > 解决方案 > 为什么在实体上同时使用@AllArgsConstructor 和@NoArgsConstructor?

问题描述

我在 IntelliJ 中的 Spring Boot 应用程序上在线看到了多个代码,许多代码同时使用两者@AllArgsConstructor@NoArgsConstructor并且两者都是构造函数,但是每个代码的目的是不同的 -

那么为什么我们在同一个实体上同时使用两者,在这种情况下它们是如何运作的呢?

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
public class Product {
    @Id
    private int id;
    private String name;
    private String type;
}

标签: spring-bootjpaconstructorlombokintellij-plugin

解决方案


这些是来自 Lombok 的注释。要了解为什么需要它,您必须了解事情在内部是如何工作的。

JPA 说它
的规范说“ JPA 规范要求所有持久类都有一个无参数构造函数。这个构造函数可能是公共的或受保护的。因为当没有定义其他构造函数时,编译器会自动创建一个默认的无参数构造函数,只有类定义构造函数还必须包含一个无参数构造函数。 "

为了进一步理解,当它使用反射创建实体时,它使用Class.newInstance()方法,该方法需要无参数构造函数来创建实例。

Spring 最常用的依赖注入类型是

  1. 基于构造函数的注入
  2. 基于 Setter 的注入

基于构造函数的注入: 当您通过传递所有参数创建对象时,您基本上使用构造函数注入。当我们拥有所有参数值并且我们想要创建一个所有值都已初始化的对象时,应该这样做。(@AllArgsConstructor)

基于 Setter 的注入:我们首先创建一个对象(不使用 arg-constructor),然后使用 setter 更新依赖项或值。(@NoArgsConstructor)

构造函数注入和 setter 注入之间有许多关键区别。

  • 部分依赖:可以使用 setter 注入,但不能通过构造函数注入。假设一个类中有 3 个属性,有 3 个 arg 构造函数和 setter 方法。在这种情况下,如果您只想传递一个属性的信息,则只能通过 setter 方法。

  • 覆盖: Setter 注入覆盖了构造函数注入。如果我们同时使用构造函数和 setter 注入,IOC 容器将使用 setter 注入。

  • 更改:我们可以通过 setter 注入轻松更改值。它不会像构造函数一样创建新的 bean 实例。所以 setter 注入比构造函数注入更灵活。


推荐阅读