【问题标题】:JBoss Weld : Inject different implementation for testingJBoss Weld:注入不同的实现进行测试
【发布时间】:2019-12-14 01:10:07
【问题描述】:

我想根据上下文在 bean 中注入不同的实现。情况如下:

interface A{}

class AImplForTest implements A{}

class AImplForProd implements A{}

class B{
    @Inject A a;
}

在测试环境中,我希望注入 AImplForTest,而在生产环境中,这应该是 AImplForProd。 B 在这两种情况下是同一个类。有可能吗?

【问题讨论】:

    标签: java jboss-weld


    【解决方案1】:

    从未在实践中使用过,但从理论上讲,您可以使用@Alternative 注释。

    来自Weld reference documentation

    Alternatives 是特定于 特定的客户端模块或部署方案。 ... 默认, @Alternative bean 被禁用。我们需要启用一个替代方案 bean 归档的 beans.xml 描述符,使其可用于 实例化和注入。此激活仅适用于 bean 在那个档案中。

    【讨论】:

    • 这是我第一次尝试的方法,但我必须在一个项目中找到我的源代码,并在另一个项目中找到测试(和 AImplForTest)。但是“存档”一词是什么意思?也许我真的不明白它的真正含义......
    【解决方案2】:

    您可以通过使用@Named 注解定义每个实现类,然后通过@Inject @Named("ForTest") A a; 注入所需的类来做到这一点。如果您还没有找到任何解决方案,希望这对您有所帮助。

    interface A{}
    
    @Named("ForTest")
    class AImplForTest implements A{}
    
    @Named("ForProd")
    class AImplForProd implements A{}
    
    class B{
       @Inject @Named("ForTest") A a;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多