2015-12-04 43 views
2

我是Dagger的新手,我之前用過Guice爲什麼匕首會注入具體的類?

我已閱讀本tutorial

,我很困惑:

1)爲什麼要我甚至用匕首注入混凝土構件? 在DI的所有點隱藏可替換實現的接口下。沒有?

我的意思是我可以使用Guice注入混凝土構件,但我只會在我想注入一個全局單例時做到這一點。

2)我有時看到模塊類與Inject註釋。 爲什麼需要該聲明?編譯器可以使用@Provides annotation從返回的方法中引用它。沒有?

如果這是必要的,爲什麼它有時會失蹤?如下例:

@Module 
class DripCoffeeModule { 
    @Provides Heater provideHeater() { 
    return new ElectricHeater(); 
    } 

    @Provides Pump providePump(Thermosiphon pump) { 
    return pump; 
    } 
} 

回答

0

我不能理解你的第一個問題。如果你的意思是DI的依賴關係INVERSION,它與依賴關係INJECTION不同。注入只是爲了從課堂上獲得關注,並提供他們所有的需求。

對於你的第二個問題,你需要@inject註釋來說你需要從匕首隻填充這個變量。也許你有另外三個相同類型的變量,你需要自己填充它們。假設字符串類型,你可能在你的類中有一堆字符串變量,但是你不希望所有的字符都被匕首提供,所以你只需提到@inject來告訴匕首爲你填充變量。

並解釋你的例子我必須說你不需要註釋在你的模塊注入@inject注入變量。因爲這裏是所有提供的地方Dagger已經知道他必須提供所有的方法參數變量。

當你在模塊中編寫一個方法時,你正在提供一些東西,而Dagger會爲你找到所有的方法變量變量,並使用你提供的其他方法來填充它們。讓我告訴你用一個例子:

@Module 
class DripCoffeeModule 
{ 
    @Provides Heater provideHeater() 
    { 
    return new ElectricHeater(); 
    } 

    @Provides Pump providePump(Thermosiphon tPump) 
    { 
    return tPump; 
    } 

    @Provides Thermosiphon provideThermosiphonPump() 
    { 
    return new Thermosiphon(); 
    } 
} 
上面匕首代碼

將使用()你之前提供的方法提供providePump tPump。所以你不需要通知匕首在模塊中使用注入。不言而喻。每當你注入一個類型爲Pump的變量時,Dagger首先在你的模塊中找到一個返回類型爲Pump(providePump)的方法,然後它認識到它需要創建一個Thermosiphon對象的實例來這樣做。所以它找到一種方法可以提供Thermosiphon(provideThermosiphonPump),然後運行它並獲取Thermosiphon對象並將其提供給提供方法,然後爲您提供Pump對象。