2015-08-31 127 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);