【发布时间】:2020-01-09 09:09:59
【问题描述】:
龙目岛和龙目岛有什么区别
@RequiredArgsConstructor
和
@RequiredArgsConstructor(onConstructor = @__(@Inject))
我知道RequiredArgsConstructor 只在构造函数中注入所有最终依赖项。
【问题讨论】:
龙目岛和龙目岛有什么区别
@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}) 也被接受。
我知道
RequiredArgsConstructor注入了所有最终依赖项。
所有必需的依赖项,包括final和@NonNull字段。
【讨论】:
@Inject/@Autowired。所以在这种情况下,给定的例子没有有效的区别。
我会用简单的例子来解释这些注释
何时使用@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 实例。然后,您可以在 @RequiredArgsConstructor(onConstructor = @__(@Inject)) 的帮助下使用构造函数注入将该 bean 实例注入到 Item 类的 shop 字段中
但我的建议是不要使用 @RequiredArgsConstructor(onConstructor = @__(@Inject)) 当您使用 Spring 时。你可以通过两种方式克服它。
1.使用@Autowired注解
public class Item {
private final Shop shop;
@Autowired
public Item(Shop shop) {
this.shop=shop;
}
}
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 可用于 final 和 non-final 字段。
@RequiredArgsConstructor 不能与非 final 字段一起使用。
【讨论】:
给出的答案清楚地解释了 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))。正如注解的属性所说,它把 @Autowired on 构造函数 告诉Spring 在构造时使用该构造函数。
就是这样!
P.S 如果你想了解更多,我推荐this article。
【讨论】: