java @RequiredArgsConstructor(onConstructor = @__(@Inject))和@RequiredArgsConstructor之间的区别是什么?

rryofs0p  于 2022-10-30  发布在  Java
关注(0)|答案(4)|浏览(425)

Lombok岛的

@RequiredArgsConstructor

@RequiredArgsConstructor(onConstructor = @__(@Inject))

我知道RequiredArgsConstructor只在构造函数中注入了所有的final依赖项。

e5nqia27

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字段组成的所有 * 必需 * 依赖项。

d7v8vwbk

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

hwazgwia

hwazgwia3#

第二个将把您提到的注解放在生成的构造函数上。
例如:@RequiredArgsConstructor(onConstructor = @__(@Inject))将生成一个用@Inject注解的构造函数

izj3ouym

izj3ouym4#

我将用简单的例子来解释这些注解

何时使用@RequiredArgsConstructor

  • 香草 java *
public class Item {
    private final String price;
    public Item(String price) {
        this.price=price;
    }
}

如果您有一个或多个final字段(非空),则使用@RequiredArgsConstructor

  • Lombok java *
@RequiredArgsConstructor
public class Item {
    private final String price;
}

何时使用@RequiredArgsConstructor(onConstructor = @__(@注入))

  • 香草 java *
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

  • 香草 java *
public class Item {
    private String price;
    public Item(String price) {
        this.price=price;
    }
}

如果你有一个或多个字段不是final(可以为空),那么使用@AllArgsConstructor。

  • Lombok java *
@AllArgsConstructor
public class Item {
    private String price;
}

备注
@AllArgsConstructor可用于final和非final字段。
@RequiredArgsConstructor不能与非final字段一起使用。

相关问题