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

What is the difference between @RequiredArgsConstructor(onConstructor = @__(@Inject)) and @RequiredArgsConstructor?

Lombok的有什么区别

@RequiredArgsConstructor 

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

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

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

例如,这个:@RequiredArgsConstructor(onConstructor = @__(@Inject)) 将生成一个用 @Inject

注释的构造函数
@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}) 也被接受。

I know RequiredArgsConstructor injects all the final dependencies.

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

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

何时使用@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 实例 class。然后,您可以在 @RequiredArgsConstructor(onConstructor = @__(@Inject))

的帮助下使用构造函数注入将该 bean 实例注入到项目 class 的商店字段中

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

1.Using @Autowired 注解

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

2.Using @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 可用于最终字段和 non-final 字段。

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

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

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

如果您有 2 个或更多构造函数怎么办? Spring 使用哪一个来构造您的 bean?输入Lombok's@RequiredArgsConstructor(onConstructor = @__(@Inject))比较流行的@RequiredArgsConstructor(onConstructor = @__(@Autowired))。正如注解的属性 says,它把 @Autowired on the constructor 告诉 Spring 在构造时使用那个构造函数。

就是这样!

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