使用CDI产生注入的对象

问题描述 投票:0回答:1

我有一个类(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();
    }


}

我得到的结果是“餐厅:煎蛋:空”,而我想得到“餐厅:煎蛋:番茄”

dependency-injection cdi
1个回答
0
投票

如果您自己提供OmeletteMaker,则CDI容器不会注入其字段。要使用@Alternative,请不要忘记在beans.xml中指定它,并让容器实例化EggMaker实例:

<alternatives>
    <class>your.package.path.OmeletteMaker</class>
</alternatives>

如果您只想用Producer方法实现这一点,那么我的回答可能是不合适的。我认为不可能。该文档说:Producer方法提供一种方法来注入不是bean的对象,其值可能在运行时变化的对象以及需要自定义初始化的对象。

© www.soinside.com 2019 - 2024. All rights reserved.