当前位置: 首页 > 知识库问答 >
问题:

使用CDI+Weld的构造器注射

单于山
2023-03-14

我想使用构造函数注入,因为它使我的单元测试更安全,更容易编写:我不能忘记设置要注入的字段。CDI支持这一点,@inject注释的javadoc表示:“对于没有其他构造函数的公共无参数构造函数,@inject是可选的。这使注入器能够调用默认构造函数。”

我知道其他标准需要一个无参数的构造函数(例如JAX-RS;参见这个问题),这是一个令人沮丧的问题。但即使对于像这样的简单类:

public class Bar {
    private final Foo foo;

    public Bar(Foo foo) {
        this.foo = foo;
    }
}

共有1个答案

谭嘉容
2023-03-14

这不是焊接缺陷。如规范所示,您需要在构造函数上使用@javax.inject.inject。只有当您有一个零参数构造函数并且您不希望容器调用任何其他构造函数时,您才不需要它。

 类似资料:
  • 我想把它转换成这样的东西: 这将使类不可变并且更容易进行单元测试。问题是,由于executorService需要通过@Resource注释获得,它似乎不能通过构造函数注入。

  • 我想使用Mojarra和Weld在Apache TomEE上运行一个WebApp。 是否因为TomEE已经使用了另一个CDI-Framework(OpenWebB)而出现了问题?有可能让TomEE和Weld一起运行吗?

  • 在尝试向CDI bean(ApplicationScoped)的构造函数中注入参数时,我遇到了以下问题: 但是,我在类上确实有一个可注入的构造函数: 有什么想法这里出了什么问题吗?

  • 尝试使用CDI 2.0建立一个maven Web项目,该项目应该在Tomcat 8.5上运行。所以我必须安装杰布斯 WELD 3。 Weld、CDI和Java EE版本之间有什么关系? 随着POM声明离开这里(只有“焊缝-servlet-核心”)… WELD - POM宣言(docs.jboss.org) 我在web上声明的“WeldTerminalListener”出现错误。这样的xml: 错误

  • 我有一个命令行JavaSE应用程序,我想对它进行一点现代化。我想在其他CDI特性中使用拦截器和依赖注入。然而,应用程序的设计并没有考虑CDI或依赖项注入,它广泛使用新的关键字和构造函数参数,而不是将对象创建委托给DI容器。CDI/Weld不会在使用new创建的对象上注入依赖项或运行拦截器,并且根本无法处理构造函数参数。一个简化的例子: Main由CDI容器实例化,someModule被注入,构造函

  • 问题内容: 我在这里找不到任何合理的答案,所以我希望它不会重复。那么为什么我应该更喜欢setter或构造函数注入而不是简单注入 如果您在类初始化期间需要对注入的bean进行某些操作,则可以使用构造函数注入的用法 但是仍然,它几乎和方法一样,并且我完全不会进行setter注入,这不只是Spring和其他DI框架之后的遗物吗? 问题答案: 构造函数和属性注入使您可以轻松地在非CDI环境中(例如,单元测