繁体   English   中英

CDI活动 <T> 通过生产者方法在课堂上注射

[英]CDI Event<T> injection in class via producer method

说我有一个抽象类:

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会注入可注入字段吗?

这里的主要问题是您使用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的注释)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM