【问题标题】:Injecting all beans of the same type with CDI使用 CDI 注入所有相同类型的 bean
【发布时间】:2016-02-13 16:17:22
【问题描述】:

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

我们还有一个类Baz,其中包含一个数据成员List<IFoo> fooList。 是否可以将所有IFoo 类动态注入fooList

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

【问题讨论】:

    标签: jakarta-ee interface cdi managed-bean multiple-instances


    【解决方案1】:

    使用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) {
                // ...
            }
        }
    }
    

    这完全有道理,例如如果要合并多个服务提供者实现的结果。你找到了一个很好的学习例子here

    另见:

    【讨论】:

    • 谢谢。还没试过,但看起来很有希望:)
    • 这是否也适用于 @Stateless Foo 实现?
    • @Frank 我在本案例的规范中找不到任何关于 EJB 的具体说明,但我可以确认这适用于 WildFly,并且我假设实例查找旨在在 CDI 和 EJB 之间兼容世界。
    • @Jens 如果实例的类型是接口,它似乎只适用于非无状态 bean。
    • @Frank 您的 beans.xml 是否包含 bean-discovery-mode="all"
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2011-05-07
    • 2014-06-02
    • 2011-09-19
    相关资源
    最近更新 更多