通过生产者方法在 class 中注入 CDI 事件<T>

CDI Event<T> injection in class via producer method

假设我有一个摘要class:

public abstract class MyAbstractClass {
   @Inject
   private Event<MyEvent> myEvent;

   ...

   // Invoked by subclasses.
   protected void notifyListeners() {
      myEvent.fire(...);
   }
}

和一系列 class 扩展了这个摘要 class:

public class MyOneClass extends MyAbstractClass { ... }

public class MyTwoClass extends MyAbstractClass { ... }

然后是生产者方法:

@Produces
MyAbstractClass getMyAbstractClass() {
   if (...) {
      return new MyOneClass();
   }

   return new MyTwoClass();
}

CDI 会注入可注射区域吗?

这里的主要问题是您使用 new 在生产者中实例化了 MyOneClass 或 MyTwoClass。 这样做,您的实例将不会被 CDI 视为托管 bean,因此不会在其中发生注入。

正确的方法是:

@Produces
MyAbstractClass getMyAbstractClass(MyOneClass class1, MyTwoClass class2) {
   if (...) {
      return class1;
   }
   return class2;
}

CDI 将在调用生产者时注入两个(托管)bean,并且 return 您需要的那个。

请注意,您也可以考虑使用限定符来注入适当的 bean,而不是这样做(尽管并非总是可行)。

编辑: 在官方网站上有一个记录在案的例子:https://docs.oracle.com/javaee/6/tutorial/doc/gkgkv.html#gmglj

Edit2:删除了@New 注释(参见 Siliarus 的评论)