【问题标题】:What is the difference between @RequiredArgsConstructor(onConstructor = @__(@Inject)) and @RequiredArgsConstructor?@RequiredArgsConstructor(onConstructor = @__(@Inject)) 和 @RequiredArgsConstructor 有什么区别?
【发布时间】:2020-01-09 09:09:59
【问题描述】:

龙目岛和龙目岛有什么区别

@RequiredArgsConstructor 

@RequiredArgsConstructor(onConstructor = @__(@Inject))

我知道RequiredArgsConstructor 只在构造函数中注入所有最终依赖项。

【问题讨论】:

    标签: java spring lombok inject


    【解决方案1】:

    第二个会把你提到的注释放在生成的构造函数上。

    例如:@RequiredArgsConstructor(onConstructor = @__(@Inject)) 将生成一个带有@Inject注解的构造函数

    【讨论】:

      【解决方案2】:
      @RequiredArgsConstructor
      class MyClass {
        private final DependencyA a;
        private final DependencyB b;
      }
      

      会生成

      public MyClass(DependencyA a, DependencyB b) {
        this.a = a;
        this.b = b;
      }
      

      同时

      @RequiredArgsConstructor(onConstructor = @__(@Inject))
      class MyClass {
        private final DependencyA a;
        private final DependencyB b;
      }
      

      会生成

      @Inject
      public MyClass(DependencyA a, DependencyB b) {
        this.a = a;
        this.b = b;
      }
      

      从 JDK 8 开始,语法 @RequiredArgsConstructor(onConstructor_ = {@Inject}) 也被接受。

      我知道RequiredArgsConstructor 注入了所有最终依赖项。

      所有必需的依赖项,包括final@NonNull字段。

      【讨论】:

      • 注:从 Spring 4.3 开始,如果只有一个构造函数,您将不再使用 need @Inject/@Autowired。所以在这种情况下,给定的例子没有有效的区别。
      【解决方案3】:

      我会用简单的例子来解释这些注释

      何时使用@RequiredArgsConstructor

      香草java

      public class Item {
          private final String price;
          public Item(String price) {
              this.price=price;
          }
      }
      

      如果您有一个或多个最终字段(非空),则使用 @RequiredArgsConstructor

      龙目岛java

      @RequiredArgsConstructor
      public class Item {
          private final String price;
      }
      

      何时使用@RequiredArgsConstructor(onConstructor = @__(@Inject))

      香草java

      public class Item {
          private final Shop shop;
          public Item(Shop shop) {
              this.shop=shop;
          }
      }
      

      如果您有一个具有自己类型的字段,并且在配置类中创建了 bean 实例。然后,您可以在 @RequiredArgsConstructor(onConstructor = @__(@Inject)) 的帮助下使用构造函数注入将该 bean 实例注入到 Item 类的 shop 字段中

      但我的建议是不要使用 @RequiredArgsConstructor(onConstructor = @__(@Inject)) 当您使用 Spring 时。你可以通过两种方式克服它。

      1.使用@Autowired注解

      public class Item {
          private final Shop shop;
          @Autowired
          public Item(Shop shop) {
              this.shop=shop;
          }
      }
      

      2.使用@AllArgsConstructor注解

      @AllArgsConstructor
      public class Item {
          private final Shop shop;
      }
      

      有人助攻我会加分

      何时使用@AllArgsConstructor

      香草java

      public class Item {
          private String price;
          public Item(String price) {
              this.price=price;
          }
      }
      

      如果您有一个或多个不是最终的(可为空)的字段,请使用 @AllArgsConstructor。

      龙目岛java

      @AllArgsConstructor
      public class Item {
          private String price;
      }
      

      注意

      @AllArgsConstructor 可用于 final 和 non-final 字段。

      @RequiredArgsConstructor 不能与非 final 字段一起使用。

      【讨论】:

      • 你的意思是“this.shop=shop;”而不是“this.price=price;”,在 Shop member 的情况下,对吧?
      • 谢谢。这是一个错误并修改了答案
      • 嗨,如果有其他变量或服务初始化但不想被注入,你将无法控制它?
      【解决方案4】:

      给出的答案清楚地解释了 OP 所要求的区别。但我也觉得知道为什么需要@RequiredArgsConstructor(onConstructor = @__(@Inject)) 而不是@RequiredArgsConstructor?也很重要。如果您有兴趣,请继续阅读...

      简而言之,当 Spring 构造你的 bean 时(带有 @Component 或相关 @Controller、@Service、@Repository 注释的类 - 它们都具有 @Component + 额外功能),Spring 将需要查看类构造函数,以构建它。如果你的类中只有 1 个构造函数,很好,没有混淆,你只需要 @RequiredArgsConstructor

      如果您有 2 个或更多构造函数怎么办? Spring 使用哪一个来构造你的 bean?输入Lombok's@RequiredArgsConstructor(onConstructor = @__(@Inject))更受欢迎的 @RequiredArgsConstructor(onConstructor = @__(@Autowired))。正如注解的属性所说,它把 @Autowired on 构造函数 告诉Spring 在构造时使用该构造函数。

      就是这样!

      P.S 如果你想了解更多,我推荐this article

      【讨论】:

        猜你喜欢
        • 2016-05-31
        • 1970-01-01
        • 2016-11-27
        • 2011-11-25
        • 2011-08-18
        • 2019-06-17
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多