2015-08-31 128 views
1

这是我第一次使用依赖注入,我有点困惑。简单的依赖注入不工作

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

我已经尝试了一个简单的例子:

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

+0

您使用的是DI容器吗?也许您应该使用构造函数注入来注入品牌依赖项,即在类构造函数a中添加BrandService参数,然后将其保存到$品牌字段 –

+0

DI容器中?我正在使用这个游戏,我认为,为我管理... 我已经尝试过您的解决方案,但由于缺少参数而导致'new StockResponse()'语句失败... –

+0

您在哪里创建StockReponse实例?您应该在[组合根目录](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)中创建它。你应该做一些新的StockReponse(新品牌服务())。这被称为[Pure DI](http://blog.ploeh.dk/2014/06/10/pure-di/)。我从未使用过播放框架,也不知道它是如何使用的。 –

回答

1

我有类似的困难,以了解DI(Guice out of Java EE)的工作原理。简单地说,Guice必须有机会修改你的对象,例如:

  • 通常由施工协助。 你问吉斯“可以创建我的对象” injector.getInstance(cls),然后吉斯是你创建对象,解决现场或构造注释

在正常(不支持Java EE)环境同比从来没有叫经典构造,你问的第二个手。

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

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

其结果是同比不给机会注入任何东西,是空

人遗憾的是,我在金发女郎水平说。这样的方式,就像我几年前发现DI

更正代码。不

StockResponse stock= new StockResponse(); 

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

编辑:我故意不回答“怎么写吉斯模块”,认为这是其他,说来话长

0

这可能是工作,假设BrandService可以是一个具体的类,或者它是一个接口,你已经为你的DI配置中的其他地方提供了一个绑定(例如Guice或Spring @Configuration中的一个模块)。我看到一个明显的NullPointerExceptionstr变量。你有意这么做吗?

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