简单依赖注入不起作用

Simple Dependency injection not working

第一次使用依赖注入,有点懵

我不太明白它是如何工作的。

我试过一个简单的例子:

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 的工作原理,但我找不到我的错误。

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

  • 平时协助施工。 你问 Guice "can You create my object" injector.getInstance(cls),然后 Guice 正在为你创建对象,解决字段或构造函数注解

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

  • 其他方法。 很少有库/框架在某些类型的对象上与 Guice(我个人喜欢 Apache Wicket)集成 "creation listeners"。 DI的辛勤工作,在你眼里是隐藏的,却在执行。

  • Java EE 可以说是比我更好的 EE 程序员:(

因此 Yoy 不给注入任何东西的机会,为 null

专业人士抱歉,我说的是金发女郎级别的。这就像我几年前发现 DI

代码更正。没有

StockResponse stock= new StockResponse();

但是

 mod = .... // Module 
   injector = Guice.createInjector(mod); // global or almost global 
...
   injector.getInstance(StockResponse.class);

编辑:我故意不回答 "how to write Guice module",假设这是另一个长篇故事

这可行,假设 BrandService 是一个具体的 class 或者如果它是一个接口,您已经在 DI 配置中的其他地方为它提供了一个具体的 class 的绑定(比如一个模块在 Guice 或 Spring @Configuration 中)。我确实看到一个明显的 NullPointerExceptionstr 变量。您是故意这样做的吗?

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