gpt4 book ai didi

Java CDI : Dynamically selecting an implementation based on qualifier?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:43 26 4
gpt4 key购买 nike

我正在尝试使用 CDI 使应用程序可扩展,但似乎我遗漏了一 block 拼图。

我想要的:有一个全局配置,它将定义要使用的接口(interface)实现。这些实现会有像@ImplDescriptor(type="type1") 这样的注释。

我尝试过的:

 @Produces
public UEInterface createUserExit(@Any Instance<UEInterface> instance, InjectionPoint ip) {
Annotated annotated = ip.getAnnotated();
UESelect ueSelect = annotated.getAnnotation(UESelect.class);
if (ueSelect != null) {
System.out.println("type = " + ueSelect.type());
}

System.out.println("Inject is ambiguous? " + instance.isAmbiguous());
if (instance.isUnsatisfied()) {
System.out.println("Inject is unsatified!");
return null;
}

// this would be ok, but causes an exception
return instance.select(ueSelect).get();

// or rather this:
for (Iterator<UEInterface> it = instance.iterator(); it.hasNext();) {
// problem: calling next() will trigger instantiation which will call this method again :(
UEInterface candidate = it.next();
System.out.println(candidate.getClass().getName());
}
}

此代码与我见过的一个示例很接近:@Produces 方法将用于选择和创建实例,并且将候选列表作为 Instance 注入(inject)。如果该方法只是创建并返回一个实现,它就可以正常工作。我只是不知道如何从 Instance 中检查和选择候选人。查看“内容”的唯一方法似乎是 Iterator 。但是只要我调用 next(),它就会尝试创建实现...不幸的是,为此调用了我的 @Produces 方法,从而创建了无限递归。我错过了什么?我如何检查候选人并选择一个?当然我只想实例化其中一个...

在此先感谢您的帮助和提示!

最佳答案

我认为问题在于您正在尝试选择注释的类,而不是将注释用作选择器限定符。使用该类直接搜索实现该类的实现。您需要使用 @ImplDescriptor 类创建一个 AnnotationLiteral,以使用它作为限定符来执行选择。像这样创建一个扩展 AnnotationLiteral 的类。

public class ImplDescriptorLiteral extends AnnotationLiteral<ImplDescriptor> implements ImplDescriptor {
private String type;
public ImplDescriptorLiteral(String type) {
this.type = type;
}

@Override
public String type() {
return type;
}

}

然后您可以使用您想要的类型将此类的实例传递给 select 方法。

instance.select(new ImplDescriptorLiteral("type1")).get();

引用Obtaining a contextual instance by programmatic lookup documentation获取更多信息。

关于Java CDI : Dynamically selecting an implementation based on qualifier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992641/

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