【问题标题】:How to inject any bean that matches Qualifier in CDI如何在 CDI 中注入与限定符匹配的任何 bean
【发布时间】:2020-11-26 15:25:42
【问题描述】:

在 JakartaEE 中使用 CDI,我想注入匹配 任何 给定限定符的 bean,而不是匹配 所有 限定符的 bean :

@MikeD class MikeDBean implements BBoy {}
@AdRock class AdRockBean implements BBoy {}
@MCA class MCABean implements BBoy {}

class Alive {

  @Inject
  @AdRock
  @MCA
  Instance<BBoy> performers;
}

在这个给定的示例中,CDI 不会注入 bean,因为没有符合 MCAAdRock 的候选人。如何同时注入MCAAdRock?换句话说,如何使用 OR 而不是 AND 限定符进行 CDI 注入。

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    您通常会这样做:

      @Inject
      @Any
      Instance<BBoy> performers;
    

    然后执行选择:

      Instance<BBoy> select = baseControllerInstance.select(new NamedLiteral...);
      ... select.get();
    

    AnnotationLiteral 的值是这样的:

     private class NamedLiteral extends AnnotationLiteral<BBoy> implements AdRock, MCA {}
    

    参考资料:

    足枪:

    • Instance 和 Provider 是棘手的主人。如果您不小心将它们与依赖范围的 bean 一起使用,您必须调用 provider.destroy(instance) 方法,否则您的应用程序将会泄漏!

    【讨论】:

    • 这确实是一个解决方案。事实上,我在代码的不同部分使用它,其中需要以编程方式获取 bean。在目前的用例中,我正在寻找一个静态配置。
    【解决方案2】:

    回答我自己的问题,因为乔纳森的解决方案也是有效的。

    我最终以这种方式在类声明中注入了依赖项。这些服务是在 init 时注入的,并且可以作为可迭代的,允许我对它们进行流式传输。

    abstract class Song {
    
        Iterable<BBoy> mcs;
    
        protected void setMCs(BBoy... bboy) {
            this.mcs = Arrays.asList(bboy);
        }
    }
    
    class Alive extends Song {
        @Inject
        void init(@MCA BBoy mca, @AdRock BBoy adRock) {
            this.setMCs(mca, adRock);
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您不想使用我在其他答案中概述的方法,则需要编写一个 CDI 便携式扩展(这听起来很可怕,但实际上很容易)。关于您的问题,您实际上想要的是与 CDI 规范所说的完全相反的。也就是说,实际上还可以!这就是扩展的用途。

      你会做任何注释可能是@Either({AdRock.class, MCA.class})。然后你的扩展会实现这个方法:

      <T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> pat) {
      ...
      }
      

      并监听带有@Either 注释的类。此时,您可以检查注入的字段并确定您想要做什么。

      参考:

      示例(随机搜索):

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 2019-08-04
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 2014-06-02
        • 2011-06-05
        • 1970-01-01
        相关资源
        最近更新 更多