简单的依赖注入不起作用

时间:2015-08-31 09:35:29

标签: java dependency-injection guice

这是我第一次使用依赖注入,我有点困惑。

我真的不明白它是如何运作的。

我试过一个简单的例子:

public class StockResponse extends Response
{
    @Inject BrandService $brand;

    public List<StockResponseItem> stock;

    public StockThresholdResponse()
    {
        stock = new ArrayList<>();
    }

    public static StockThresholdResponse create(List<DataItem> data)
    {
        StockResponse stock= new StockResponse();

        for (ThresholdCheckAggregate data: d)
        {
            StockResponseItem item = new StockResponseItem();

            item.id = d.thresholdId;
            item.brand = str.$brand.byId(d.brand);

            str.stockThresholds.add(item);
        }
        return str;
    }
}

但是当我使用create()方法时,我得到$brand的空指针异常。

我想我误解了DI是如何工作的,但我找不到我的错误。

2 个答案:

答案 0 :(得分:1)

我在理解DI(Java EE中的Guice)如何工作方面遇到了类似的困难。简单来说,Guice必须有机会修改You对象,例如:

  • 通常通过施工协助。 你问Guice“你可以创建我的对象”injector.getInstance(cls),然后Guice正在为你创建对象,解决字段或构造函数注释

在普通(非Java EE)环境中,Yoy从不调用经典构造函数,你是二手问。

  • 其他方法。 很少有库/框架与Guice(我个人喜欢的Apache Wicket)在某些类型的对象上与“创建侦听器”集成。 DI的辛勤工作对你的眼睛来说是隐藏的,但却被执行了。

  • Java EE让我说EE程序员比我更好:(

因此,Yoy没有机会注入任何东西,是空的

专业人士抱歉我在金发女郎级别说。就像我几年前发现DI一样

对代码的更正。不

StockResponse stock= new StockResponse();

但是

 mod = .... // Module 
   injector = Guice.createInjector(mod); // global or almost global 
...
   injector.getInstance(StockResponse.class);
编辑:故意我不回答“如何编写Guice模块”,假设这是其他的长篇故事

答案 1 :(得分:0)

这可能有效,假设BrandService是一个具体类或者它是一个接口,你已经为它配置了一个绑定到DI配置中其他地方的具体类(比如Guice或Spring @Configuration中的模块)。我确实看到一个带有NullPointerException变量的明显str。你的意思是这样做的吗?

item.brand = stock.$brand.byId(d.brand);