我有一个类(OmeletteMaker),其中包含一个注入的字段(Vegetable)。我想写一个生产者,实例化此类的注入对象。如果我使用“ new”,则结果将不使用注入。如果我尝试使用WeldContainer,则会收到异常,因为OmeletteMaker是@Alternative。有没有第三种方法可以做到这一点?
这是我的代码:
@Alternative
public class OmeletteMaker implements EggMaker {
@Inject
Vegetable vegetable;
@Override
public String toString() {
return "Omelette: " + vegetable;
}
}
注射用蔬菜:
public class Tomato implements Vegetable {
@Override
public String toString() {
return "Tomato";
}
}
主文件
public class CafeteriaMainApp {
public static WeldContainer container = new Weld().initialize();
public static void main(String[] args) {
Restaurant restaurant = (Restaurant) container.instance().select(Restaurant.class).get();
System.out.println(restaurant);
}
@Produces
public EggMaker eggMakerGenerator() {
return new OmeletteMaker();
}
}
我得到的结果是“餐厅:煎蛋:空”,而我想得到“餐厅:煎蛋:番茄”
如果您自己提供OmeletteMaker,则CDI容器不会注入其字段。要使用@Alternative
,请不要忘记在beans.xml
中指定它,并让容器实例化EggMaker实例:
<alternatives>
<class>your.package.path.OmeletteMaker</class>
</alternatives>
如果您只想用Producer方法实现这一点,那么我的回答可能是不合适的。我认为不可能。该文档说:Producer方法提供一种方法来注入不是bean的对象,其值可能在运行时变化的对象以及需要自定义初始化的对象。