通过生产者方法在类中进行CDI Event <t>注入

时间:2018-10-02 13:45:09

标签: java cdi

说我有一个抽象类:

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

   ...

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

和扩展此抽象类的一系列类:

public class MyOneClass extends MyAbstractClass { ... }

public class MyTwoClass extends MyAbstractClass { ... }

然后是生产者方法:

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

   return new MyTwoClass();
}

CDI会注入可注入字段吗?

1 个答案:

答案 0 :(得分:1)

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

正确的方法是:

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

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

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

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

Edit2:删除了@New注释(请参阅Siliarus的注释)