Android的依賴注入框架-Dagger2(二)

Dagger2 起步走

在上一篇簡單談論了 Dependency Injection 以及 Dagger2 的一些基礎,接下來就要用實例來告訴大家怎麼使用 Dagger2

這裡先假設一個業務場景,我們在 BaseActivity 需要建立一個網路連線 NetworkManager 去跟後台做API的串接,這裡先不考慮其他架構性的問題,只希望能簡短的用一個實例來跟大家講解。然後我們為了再深入說明 Component 之間的依賴關係,NetworkManager 建構需要依賴一個 HttpConnect 對象。

依賴的關係圖

BaseActivity 依賴 —> NetworkManager 依賴 —> HttpConnect

所以我們一開始在 BaseActivity 標記 :

1
2
3
4
5
6
public class BaseActivity {
@Inject
NetworkManager networkManager;

...
}

定義 Module

定義 Module,提供對象依賴,這邊會加入該物件生命週期的標記,我們後面會再談在 Dagger2 中的生命週期有關的討論。我們假設 NetworkManagerHttpConnect 在整個 App 中,應該只會有一個實例。

1
2
3
4
5
6
@Module
public class NetworkModule {
@Singleton
@Provider
NetworkManager provideNetworkManager(HttpConnect connect)
}
1
2
3
4
5
6
7
8
@Module
public class HttpModule {
@Singleton
@Provider
HttpConnect provideHttpConnect() {
return new HttpConnect();
}
}

定義 Component

定義完 Module 之後,我們需要 Component 把依賴關係連結起來。

1
2
3
4
5
@Singleton
@Component(modules = {HttpModule.class})
public interface HttpComponent{
public HttpConnect getHttpConnect();
}
1
2
3
4
5
6
@Singleton
@Component(modules = {NetworkModule.class}, dependencies = {HttpComponent.class})
public interface NetworkComponent{
void inject(BaseActivity baseActivity);
public NetworkManager getNetworkManager();
}

因為 HttpComponent 不直接注入其他對象,所以裡面就不寫入

void inject(Target target)

初始化 Component

接著我們編譯一下專案,dagger2 會自動生成這幾個類別:DaggerHttpComponent

DaggerNetworkComponent 兩個類別。接著我們對他做初始化。

1
2
3
4
5
6
7
8
httpComponent = DaggerHttpComponent.builder()
.httpModule(new HttpModule())
.build();

networkComponent = DaggerNetworkComponent.builder()
.htppComponent(httpComponent)
.networkModule(new NetworkModule())
.build();

由於 NetworkComponent 依賴 HttpComponent 所以初始化的時候需要傳入一個實例,如果 Module 沒有定義建構子,那個可以省略 .httpModule(new HttpModule()).networkModule(new NetworkModule()) ,如果有自定義需要傳參數的建構子,那麼就要根據你的需求,去決定是不是要建立有參數的 Module 實體。在什麼地方初始化,由自己控制,這裡寫在一起不代表所有 Component 都會在一起初始化,有的可能在 Application ,有的在 Fragment ,端看你怎麼定義 Component 的生命週期。

注入

1
2
3
4
5
6
7
8
9
10
11
12
public class BaseActivity{
@Inject
NetworkManager networkManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
//假設 networkComponent 已初始化
networkComponent.inject(this);
}
}

在呼叫 networkComponent.inject(this); 之後,依賴這個 Component 的對象就都有了實體。

結論

以上就是一些最簡單的 Dagger2 的使用方式,在後面我們會談到關於生命週期的相關討論,以及在 Dagger2.11 之後的版本新增的功能。