@RequiredArgsConstructor(onConstructor = @__(@ Inject))和@RequiredArgsConstructor有什么区别?

时间:2019-09-06 13:21:23

标签: java spring lombok inject

龙目岛的

有什么区别
@RequiredArgsConstructor 

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

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

4 个答案:

答案 0 :(得分:3)

@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字段。

答案 1 :(得分:3)

给出的答案清楚地说明了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))。作为注释的属性 says ,它将@Autowired 放在构造函数上,以告知Spring在构造时使用该构造函数。

就这样!

附言:如果您想了解更多信息,我建议this article

答案 2 :(得分:2)

第二个将您提到的注释放在生成的构造函数上。

例如,此:@RequiredArgsConstructor(onConstructor = @__(@Inject)) 将生成一个带有@Inject

注释的构造函数

答案 3 :(得分:1)

我将通过简单的示例来解释这些注释

何时使用@RequiredArgsConstructor

香草java

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

如果您有一个或多个最终字段(不为null),请使用@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.price=price;
        }
    }

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

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

  1. 使用@Autowired注释

    公共类项目{

             private final Shop shop;
    
          @Autowired
          public Item(Shop shop)
         {
             this.price=price;
         }
     }
    
  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 可以用于最终字段和非最终字段。

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