说我有一个抽象类:
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会注入可注入字段吗?
答案 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的注释)