【发布时间】:2020-01-27 12:21:32
【问题描述】:
我想使用构造函数注入,因为它使我的单元测试更安全、更容易编写:我不能忘记设置要注入的字段。 CDI 支持这一点,@Inject 注释的 javadoc 说:“@Inject 对于没有其他构造函数存在的公共、无参数构造函数是可选的。这使注入器能够调用默认构造函数。”
我了解其他标准需要无参数构造函数(例如 JAX-RS;请参阅 this question),这很糟糕。但即使对于像这样的简单类:
public class Bar {
private final Foo foo;
public Bar(Foo foo) {
this.foo = foo;
}
}
焊接失败,说:DeploymentException: WELD-001408: Unsatisfied dependencies for type Bar。当我添加 @Inject 注释时,它可以工作。
我真的不希望 Weld 出现任何错误,因为它已经建立多年了;我大概搞错了。但也许它引起了人们的注意,只是因为 Jakarta EE 社区根本不做任何构造函数注入。
【问题讨论】:
-
不确定到底是什么问题?正如规范所说,您不需要添加
@Inject注释如果有一个公共的、无参数的构造函数(隐式或显式)没有其他构造函数存在 .您有一个单参数构造函数,因此您需要将@Inject注释添加到该构造函数。如果您还需要一个无参数构造函数,您也可以添加它,但您可能不得不放弃将foo设为 final。 -
@Slaw 我创建了一个简约的演示项目on GitHub。
Boundary注入Bar注入Foo。与Bar的第 8 行中的@Inject一起工作正常。当我删除该注释时,Weld 抱怨:“org.jboss.weld.exceptions.DeploymentException: WELD-001408: 在注入点 [UnbackedAnnotatedField] @Inject demo.Boundary.bar 带有限定符 @Default 的 Bar 类型的依赖关系不满足”。跨度> -
只是为了澄清,因为您已经接受了一个答案:您本身没有无参数构造函数,这意味着您引用的规范中记录了
@Inject注释. -
完全正确...我已经过度阅读了,因为它太违反直觉了。我认为只有在有多个构造函数来消除歧义时才需要它。谢谢!
-
只有默认构造函数 => 没有构造函数注入。多个构造函数 => 使用
@Inject标记要使用的构造函数。我们同意这一点。但是当我只有一个(非默认)构造函数时,我认为 CDI 可以接受:在我看来,其他任何东西都没有任何意义。我认为这里的标准太保守了。但我明白了道理。谢谢!
标签: java dependency-injection cdi weld constructor-injection