龙目岛的
有什么区别@RequiredArgsConstructor
和
@RequiredArgsConstructor(onConstructor = @__(@Inject))
我知道RequiredArgsConstructor
仅将所有最终依赖项注入构造函数中。
答案 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时。您可以通过两种方法克服它。
使用@Autowired注释
公共类项目{
private final Shop shop;
@Autowired
public Item(Shop shop)
{
this.price=price;
}
}
使用@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 不能与非最终字段一起使用。