Lombok岛的
@RequiredArgsConstructor
和
@RequiredArgsConstructor(onConstructor = @__(@Inject))
我知道RequiredArgsConstructor只在构造函数中注入了所有的final依赖项。
RequiredArgsConstructor
e5nqia271#
@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字段组成的所有 * 必需 * 依赖项。
@RequiredArgsConstructor(onConstructor_ = {@Inject})
final
@NonNull
d7v8vwbk2#
给出的答案已经清楚地解释了OP所问的区别是什么。但是我也觉得知道为什么你需要@RequiredArgsConstructor(onConstructor = @__(@Inject))而不是@RequiredArgsConstructor?也很重要。如果你感兴趣,请继续阅读...简而言之,当Spring构造你的bean(用@Component或者相关的@Controller、@Service、@Repository标注的类--它们都有@Component +额外的功能)时,Spring需要查看类的构造函数来构造它。如果你的类中只有一个构造函数,那么很好,不要混淆,你只需要@RequiredArgsConstructor。如果你有两个或更多的构造函数呢?Spring使用哪一个来构造你的bean?输入Lombok's@RequiredArgsConstructor(onConstructor = @__(@Inject))或更流行的@RequiredArgsConstructor(onConstructor = @__(@Autowired))。正如注解的属性 * 所说 ,它把*@Autowired放在*构造函数上,告诉Spring在构造时使用那个构造函数。就是这样!如果你想了解更多,我推荐this article。
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
hwazgwia3#
第二个将把您提到的注解放在生成的构造函数上。例如:@RequiredArgsConstructor(onConstructor = @__(@Inject))将生成一个用@Inject注解的构造函数
@Inject
izj3ouym4#
我将用简单的例子来解释这些注解
何时使用@RequiredArgsConstructor
public class Item { private final String price; public Item(String price) { this.price=price; } }
如果您有一个或多个final字段(非空),则使用@RequiredArgsConstructor
@RequiredArgsConstructor public class Item { private final String price; }
何时使用@RequiredArgsConstructor(onConstructor = @__(@注入))
public class Item { private final Shop shop; public Item(Shop shop) { this.shop=shop; } }
如果你有一个自己类型的字段,并且在配置类中创建了bean示例,那么你可以在@RequiredArgsConstructor(onConstructor = @(@Inject))的帮助下,使用构造函数注入将该bean示例注入到Item类的shop字段中但是我的建议是当你使用Spring的时候不要使用@RequiredArgsConstructor(onConstructor = @(@Inject))。1.使用@自动布线注解
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
public class Item { private String price; public Item(String price) { this.price=price; } }
如果你有一个或多个字段不是final(可以为空),那么使用@AllArgsConstructor。
@AllArgsConstructor public class Item { private String price; }
备注@AllArgsConstructor可用于final和非final字段。@RequiredArgsConstructor不能与非final字段一起使用。
4条答案
按热度按时间e5nqia271#
将产生
同时
将产生
从JDK 8开始,还接受语法
@RequiredArgsConstructor(onConstructor_ = {@Inject})
。我知道
RequiredArgsConstructor
注入了所有的最终依赖项。由
final
和@NonNull
字段组成的所有 * 必需 * 依赖项。d7v8vwbk2#
给出的答案已经清楚地解释了OP所问的区别是什么。但是我也觉得知道为什么你需要
@RequiredArgsConstructor(onConstructor = @__(@Inject))
而不是@RequiredArgsConstructor
?也很重要。如果你感兴趣,请继续阅读...简而言之,当Spring构造你的bean(用@Component或者相关的@Controller、@Service、@Repository标注的类--它们都有@Component +额外的功能)时,Spring需要查看类的构造函数来构造它。如果你的类中只有一个构造函数,那么很好,不要混淆,你只需要
@RequiredArgsConstructor
。如果你有两个或更多的构造函数呢?Spring使用哪一个来构造你的bean?输入Lombok's
@RequiredArgsConstructor(onConstructor = @__(@Inject))
或更流行的@RequiredArgsConstructor(onConstructor = @__(@Autowired))
。正如注解的属性 * 所说 ,它把*@Autowired放在*构造函数上,告诉Spring在构造时使用那个构造函数。就是这样!
如果你想了解更多,我推荐this article。
hwazgwia3#
第二个将把您提到的注解放在生成的构造函数上。
例如:
@RequiredArgsConstructor(onConstructor = @__(@Inject))
将生成一个用@Inject
注解的构造函数izj3ouym4#
我将用简单的例子来解释这些注解
何时使用@RequiredArgsConstructor
如果您有一个或多个final字段(非空),则使用@RequiredArgsConstructor
何时使用@RequiredArgsConstructor(onConstructor = @__(@注入))
如果你有一个自己类型的字段,并且在配置类中创建了bean示例,那么你可以在@RequiredArgsConstructor(onConstructor = @(@Inject))的帮助下,使用构造函数注入将该bean示例注入到Item类的shop字段中
但是我的建议是当你使用Spring的时候不要使用@RequiredArgsConstructor(onConstructor = @(@Inject))。
1.使用@自动布线注解
2.使用@AllArgsConstructor注解
我会为某人的协助加一分
何时使用@AllArgsConstructor
如果你有一个或多个字段不是final(可以为空),那么使用@AllArgsConstructor。
备注
@AllArgsConstructor可用于final和非final字段。
@RequiredArgsConstructor不能与非final字段一起使用。