JBoss Weld:注入不同的实现进行测试

发布于 2025-01-04 06:34:00 字数 257 浏览 0 评论 0原文

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

interface A{}

class AImplForTest implements A{}

class AImplForProd implements A{}

class B{
    @Inject A a;
}

在测试上下文中,我希望注入 AImplForTest,而在生产上下文中,这应该是 AImplForProd。 B 在两个上下文中是同一类。是否可以?

I would like to inject a different implementation in a bean, depending on the context. Here is the situation :

interface A{}

class AImplForTest implements A{}

class AImplForProd implements A{}

class B{
    @Inject A a;
}

In a test context, I would like the AImplForTest to be injected, while in a production context, this should be AImplForProd. B is the same class in the two contexts. Is it possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南笙 2025-01-11 06:34:00

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

来自焊接参考文档

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

Never used in practice but from theory you could use the @Alternative annotation.

From the Weld reference documentation:

Alternatives are beans whose implementation is specific to a
particular client module or deployment scenario. ... By default,
@Alternative beans are disabled. We need to enable an alternative in
the beans.xml descriptor of a bean archive to make it available for
instantiation and injection. This activation only applies to the beans
in that archive.

小梨窩很甜 2025-01-11 06:34:00

您可以通过使用 @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;
}

You can do this by defining each implementing class with @Named annotation and then inject the desired one by @Inject @Named("ForTest") A a; Hope this helps you if you didn't found any solution yet.

interface A{}

@Named("ForTest")
class AImplForTest implements A{}

@Named("ForProd")
class AImplForProd implements A{}

class B{
   @Inject @Named("ForTest") A a;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文