Java 简单依赖注入不起作用

Java 简单依赖注入不起作用,java,dependency-injection,guice,Java,Dependency Injection,Guice,这是我第一次使用依赖注入,我有点困惑 我真的不明白它是怎么工作的 我试过一个简单的例子: public class StockResponse extends Response { @Inject BrandService $brand; public List<StockResponseItem> stock; public StockThresholdResponse() { stock = new ArrayList<&

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

我真的不明白它是怎么工作的

我试过一个简单的例子:

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;
    }
}
公共类StockResponse扩展了响应
{
@注入品牌服务$brand;
公开上市股票;
公共股票阈值响应()
{
stock=newarraylist();
}
公共静态StockThresholdResponse创建(列表数据)
{
StockResponse股票=新的StockResponse();
对于(阈值检查聚合数据:d)
{
StockResponseItem项=新的StockResponseItem();
item.id=d.thresholdId;
item.brand=str.$brand.byId(d.brand);
str.stockThresholds.add(项目);
}
返回str;
}
}
但是当我使用
create()
方法时,我得到了
$brand
的空指针异常


我想我误解了DI的工作原理,但我找不到我的错误。

我在理解DI(JavaEE之外的Guice)的工作原理时也遇到了类似的困难。简单地说,Guice必须有机会修改您的对象,例如:

  • 通常由施工协助。 您询问Guice“您能创建我的对象吗”
    injector.getInstance(cls)
    ,然后Guice为您创建对象,解决字段或构造函数注释
在正常的(非JavaEE)环境中,Yoy从不调用经典构造函数,这是你的第二手要求

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

  • JavaEE让我们说比我更好的EE程序员:(

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

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

对代码的更正。不是

StockResponse stock= new StockResponse();
但是


编辑:我故意不回答“如何编写Guice模块”,假设这是另一个很长的故事,假设BrandService是一个具体的类,或者如果它是一个接口,您已经为它提供了一个绑定到DI配置中其他具体类的绑定(比如Guice或Spring@configuration中的模块).我确实看到一个明显的
NullPointerException
带有
str
变量。你是想这样做吗

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

你在使用DI容器吗?也许你应该使用构造函数注入注入品牌依赖关系,也就是说,在类构造函数a中添加一个BrandService参数,然后将其保存到$brand字段中。我在使用play,我想,为我管理这一点……我已经尝试了你的解决方案,但是语句
new StockResponse()
由于缺少参数而失败…您在哪里创建StockResponse实例?您应该在中创建它。您应该执行类似new StockResponse(new BrandService())的操作。这就是所谓的。我从未使用过play框架,也不知道它是如何使用的。它使用Guice框架进行自动注入如果你不想使用纯DI,似乎是这样,也许你应该在构造函数上使用@Inject注释,然后应该有一种方法通过容器而不是通过new来创建StockResponse
item.brand = stock.$brand.byId(d.brand);