gpt4 book ai didi

java - 禁用@Alternative 类

转载 作者:行者123 更新时间:2023-12-01 08:53:05 27 4
gpt4 key购买 nike

在我的 Java EE 7 程序中,我想使用 @Alternative 根据上下文、生产或测试来注入(inject)不同的实现。我所做的就是在 beans.xml 文件中声明用 @Alternative 注释的类。它工作得很好,我的替代类被注入(inject)到我想要的任何地方,而不是默认的类。但我不知道除了删除 beans.xml 文件中的声明之外,是否有办法跳过此行为并注入(inject)默认类。当应用程序被打包时,这是不容易实现的。如果我可以选择是否要使用配置文件中的默认类或替代类,例如在 WildFly 服务器的standalone.xml 文件中,那就太好了。这可能吗?

最佳答案

详细说明我的评论,您可以执行以下操作。

定义单个限定符

@Inherited
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER})
public @interface BeanSelector {

@NonBinding
private String environment;

}

定义注释文字

public class BeanSelectorImpl extends AnnotationLiteral<BeanSelector> implements BeanSelector {

private final String environment;

public BeanSelectorImpl(final String environment) {
this.environment = environment;
}

public String environment() {
return this.environment;
}
}

创建一个从环境中读取的生产者

@ApplicationScoped
public class BeanSelectorProducer {

@Any
@Inject
private Instance<MyBeanService> myBeanServices;

@Produces
@BeanSelector(environment = "")
public MyBeanService produceService() {
final String env = System.getProperty("env.property");
final BeanSelector beanSelector = new BeanSelectorImpl(env);

//You may wish to handle exceptions.
return myBeanServices.select(beanSelector).get();
}
}

此实现的负面影响是您的所有 Bean 都将投入使用。为每个环境定义不同的 beans.xml 的另一个选项可能是更好的选择。

关于java - 禁用@Alternative 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42250622/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com