Jakarta ee 使用CDI注入相同类型的所有bean

Jakarta ee 使用CDI注入相同类型的所有bean,jakarta-ee,interface,cdi,managed-bean,multiple-instances,Jakarta Ee,Interface,Cdi,Managed Bean,Multiple Instances,假设我们有一个包含类的包foos,它们都实现了一些IFoo 我们还有一个类,Baz,它包含一个数据成员,listwoolist。 是否有可能将所有这些IFoo类动态注入dublist 顺便问一下,这是一种常见的做法吗?(我不熟悉DI概念)使用javax.enterprise.inject.Instance接口动态获取Foo的所有实例: import javax.annotation.PostConstruct; import javax.enterprise.inject.Instance; i

假设我们有一个包含类的包
foos
,它们都实现了一些
IFoo

我们还有一个类,
Baz
,它包含一个数据成员,
listwoolist
。 是否有可能将所有这些
IFoo
类动态注入
dublist


顺便问一下,这是一种常见的做法吗?(我不熟悉DI概念)

使用
javax.enterprise.inject.Instance
接口动态获取
Foo
的所有实例:

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

public class Baz {

    @Inject
    Instance<Foo> foos;

    @PostConstruct
    void init() {
        for (Foo foo : foos) {
            // ...
        }
    }
}
import javax.annotation.PostConstruct;
导入javax.enterprise.inject.Instance;
导入javax.inject.inject;
公共类Baz{
@注入
实例foos;
@施工后
void init(){
for(Foo-Foo:foos){
// ...
}
}
}
这完全有道理,例如,如果您想要合并多个服务提供商实现的结果。你会发现一个很好的学习例子

另见:


  • 第5.6节。程序查找

谢谢。还没有尝试过,但看起来很有希望:)这是否也适用于@Stateless Foo implementations?@Frank我在本例的规范中找不到任何关于EJB的特定声明,但我可以确认这在WildFly上是有效的,并且我假设实例查找是为了在CDI和EJB world之间兼容。@Jens如果实例的类型是接口,它似乎只适用于非无状态bean。@Frank您的beans.xml是否包含
bean discovery mode=“all”