我想在bean中注入一个不同的实现,具体取决于上下文。情况如下:
interface A{}
class AImplForTest implements A{}
class AImplForProd implements A{}
class B{
@Inject A a;
}
在测试环境中,我希望注入AImplForTest,而在生产环境中,这应该是AImplForProd。 B在两种情况下是同一类。有可能吗?
答案 0 :(得分:1)
从未在实践中使用过,但从理论上讲,您可以使用@Alternative
注释。
来自Weld reference documentation:
替代品是bean,其实现特定于a 特定客户端模块或部署方案。 ... 默认情况下, @Alternative bean被禁用。我们需要启用替代方案 bean归档文件的beans.xml描述符,使其可用 实例化和注入。此激活仅适用于bean 在该档案中。
答案 1 :(得分:0)
您可以通过使用@Named注释定义每个实现类,然后通过@Inject @Named(“ ForTest”)A注入所需的类来实现此目的。如果您还没有找到任何解决方案,希望对您有帮助。
interface A{}
@Named("ForTest")
class AImplForTest implements A{}
@Named("ForProd")
class AImplForProd implements A{}
class B{
@Inject @Named("ForTest") A a;
}