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

nek*_*kel 10 java spring inject lombok

龙目岛的有什么区别

@RequiredArgsConstructor 
Run Code Online (Sandbox Code Playgroud)

@RequiredArgsConstructor(onConstructor = @__(@Inject))
Run Code Online (Sandbox Code Playgroud)

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

And*_*lko 15

@RequiredArgsConstructor
class MyClass {
  private final DependencyA a;
  private final DependencyB b;
}
Run Code Online (Sandbox Code Playgroud)

会产生

public MyClass(DependencyA a, DependencyB b) {
  this.a = a;
  this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

尽管

@RequiredArgsConstructor(onConstructor = @__(@Inject))
class MyClass {
  private final DependencyA a;
  private final DependencyB b;
}
Run Code Online (Sandbox Code Playgroud)

会产生

@Inject
public MyClass(DependencyA a, DependencyB b) {
  this.a = a;
  this.b = b;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 注意:从 Spring 4.3 开始,如果只有一个构造函数,则不再需要(/sf/answers/2876498201/) `@Inject`/`@Autowired` 。因此,在这种情况下,给定的示例中没有有效的差异。 (2认同)

jum*_*key 9

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

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

如果你有 2 个或更多构造函数怎么办?Spring 使用哪一个来构建您的 bean?输入Lombok's @RequiredArgsConstructor(onConstructor = @__(@Inject))更流行的 @RequiredArgsConstructor(onConstructor = @__(@Autowired)). 正如注释的属性所说,它将@Autowired放在 构造函数 以告诉 Spring 在构造时使用该构造函数。

就是这样!

PS如果您想了解更多相关内容,我推荐这篇文章。


Nir*_*evy 5

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

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