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