简单依赖注入不起作用
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 中)。我确实看到一个明显的 NullPointerException
和 str
变量。您是故意这样做的吗?
item.brand = stock.$brand.byId(d.brand);
第一次使用依赖注入,有点懵
我不太明白它是如何工作的。
我试过一个简单的例子:
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 中)。我确实看到一个明显的 NullPointerException
和 str
变量。您是故意这样做的吗?
item.brand = stock.$brand.byId(d.brand);