通过生产者方法在 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 的评论)
假设我有一个摘要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 的评论)