![](/img/trans.png)
[英]CDI producer method not working if defining class doesn't declare a scope
[英]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.