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“您能创建我的对象吗”
,然后Guice为您创建对象,解决字段或构造函数注释injector.getInstance(cls)
- 其他方法。 很少有库/框架在某些类型的对象上与Guice(我个人喜欢ApacheWicket)和“创建侦听器”集成。DI的辛勤工作隐藏在你的眼前,但却被执行
- JavaEE让我们说比我更好的EE程序员:(
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);