gpt4 book ai didi

spring-boot - 为什么在实体上同时使用@AllArgsConstructor 和@NoArgsConstructor?

转载 作者:行者123 更新时间:2023-12-04 12:22:02 28 4
gpt4 key购买 nike

我在网上看到很多关于 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 规范要求所有持久类都有一个无参数构造函数。这个构造函数可以是公共(public)的或 protected 。因为当没有定义其他构造函数时,编译器会自动创建一个默认的无参数构造函数,只有定义了构造函数的类还必须包含一个无参数构造函数。”
    为了进一步理解,当它使用反射创建和实体时,它使用 Class.newInstance() 方法,该方法需要 无参数构造函数 创建一个实例。
    Spring 使用的最常见的依赖注入(inject)类型是

  • 基于构造函数的注入(inject)
  • 基于 Setter 的注入(inject)

  • 基于构造函数的注入(inject):当您通过传递所有参数来创建对象时,您基本上使用了构造函数注入(inject)。当我们拥有所有参数值并且我们想要创建一个所有值都已初始化的对象时,应该这样做。 (@AllArgsConstructor)
    基于 Setter 的注入(inject):我们首先创建一个对象(不使用 arg-constructor),然后使用 setter 更新依赖项或值。 (@NoArgsConstructor)
    构造函数注入(inject)和 setter 注入(inject)之间有许多主要区别。
  • 部分依赖:可以使用 setter 注入(inject)进行注入(inject),但不能通过构造函数注入(inject)。假设有 3 个属性
    类,具有 3 个 arg 构造函数和 setter 方法。在这种情况下,如果
    您只想传递一个属性的信息,可以通过
    仅 setter 方法。
  • 覆盖: Setter 注入(inject)会覆盖构造函数注入(inject)。如果我们同时使用构造函数和 setter 注入(inject),IOC 容器将
    使用 setter 注入(inject)。
  • 变化:我们可以通过 setter 注入(inject)轻松更改该值。它并不总是像构造函数那样创建一个新的 bean 实例。所以二传手
    注入(inject)比构造函数注入(inject)灵活。
  • 关于spring-boot - 为什么在实体上同时使用@AllArgsConstructor 和@NoArgsConstructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68314072/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com