Android的依賴注入框架-Dagger2(二)
Dagger2 起步走
在上一篇簡單談論了 Dependency Injection
以及 Dagger2
的一些基礎,接下來就要用實例來告訴大家怎麼使用 Dagger2
。
這裡先假設一個業務場景,我們在 BaseActivity 需要建立一個網路連線 NetworkManager 去跟後台做API的串接,這裡先不考慮其他架構性的問題,只希望能簡短的用一個實例來跟大家講解。然後我們為了再深入說明 Component
之間的依賴關係,NetworkManager 建構需要依賴一個 HttpConnect 對象。
依賴的關係圖
BaseActivity
依賴 —> NetworkManager
依賴 —> HttpConnect
所以我們一開始在 BaseActivity
標記 :
1 | public class BaseActivity { |
定義 Module
定義 Module,提供對象依賴,這邊會加入該物件生命週期的標記,我們後面會再談在 Dagger2
中的生命週期有關的討論。我們假設 NetworkManager
跟 HttpConnect
在整個 App 中,應該只會有一個實例。
1 |
|
1 |
|
定義 Component
定義完 Module
之後,我們需要 Component
把依賴關係連結起來。
1 |
|
1 |
|
因為 HttpComponent
不直接注入其他對象,所以裡面就不寫入
void inject(Target target)
。
初始化 Component
接著我們編譯一下專案,dagger2
會自動生成這幾個類別:DaggerHttpComponent
、DaggerNetworkComponent
兩個類別。接著我們對他做初始化。
1 | httpComponent = DaggerHttpComponent.builder() |
由於 NetworkComponent
依賴 HttpComponent
所以初始化的時候需要傳入一個實例,如果 Module
沒有定義建構子,那個可以省略 .httpModule(new HttpModule())
與 .networkModule(new NetworkModule())
,如果有自定義需要傳參數的建構子,那麼就要根據你的需求,去決定是不是要建立有參數的 Module
實體。在什麼地方初始化,由自己控制,這裡寫在一起不代表所有 Component
都會在一起初始化,有的可能在 Application
,有的在 Fragment
,端看你怎麼定義 Component
的生命週期。
注入
1 | public class BaseActivity{ |
在呼叫 networkComponent.inject(this);
之後,依賴這個 Component
的對象就都有了實體。
結論
以上就是一些最簡單的 Dagger2
的使用方式,在後面我們會談到關於生命週期的相關討論,以及在 Dagger2.11
之後的版本新增的功能。