了解 Dagger 基本概念
創(chuàng)新互聯(lián)建站是專(zhuān)業(yè)的南山網(wǎng)站建設(shè)公司,南山接單;提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行南山網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!Google 對(duì) Dagger 的定義如下:
Dagger is a fully static, compile-time dependency injection framework for both Java and Android. It is an adaptation of an earlier version created by Square and now maintained by Google.
Dagger 是一個(gè)為 Java 和 Android 設(shè)計(jì)的完全靜態(tài),編譯時(shí)依賴(lài)注入框架。現(xiàn)在由 Google 維護(hù),它對(duì) Square 開(kāi)發(fā)的早期版本進(jìn)行了改寫(xiě)。
什么是編譯時(shí)依賴(lài)呢?就是不在運(yùn)行時(shí)依賴(lài),額...Dagger 會(huì)通過(guò)注解,生成代碼,而這個(gè)代碼跟我們手動(dòng)寫(xiě)的依賴(lài)注入的代碼一樣。
如果你對(duì)『依賴(lài)注入』不了解,請(qǐng)看[這篇文章]()(未填的坑)。
Dagger1.x已經(jīng)廢棄,我們以后所說(shuō)的Dagger就是Dagger2.x。
Dagger 使用了注解,我們先來(lái)最基本的注解的用法。
Dagger 使用注解 javax.inject.Inject 來(lái)修飾一個(gè)類(lèi)的構(gòu)造函數(shù),然后就 Dagger 就可以管理它了。當(dāng) Dagger 需要 該類(lèi)的實(shí)例時(shí),就會(huì)調(diào)用這個(gè)構(gòu)造函數(shù)來(lái)構(gòu)造它,也會(huì)自動(dòng)實(shí)例化該構(gòu)造函數(shù)的參數(shù)所需要的實(shí)例。
@Inject 也可以修飾一個(gè)類(lèi)的屬性,在構(gòu)造這個(gè)類(lèi)時(shí),Dagger 會(huì)將這個(gè)屬性所需要的對(duì)象實(shí)例化出來(lái)。但是要注意,這個(gè)屬性的類(lèi)型構(gòu)造函數(shù)需要注入即也用 @Inject 修飾。
@Inject 還可以修飾一個(gè)方法,這樣在構(gòu)造實(shí)例后,會(huì)立刻調(diào)用該方法。并不推薦這樣做,因?yàn)檫@就是初始化的工作嘛,都可以在構(gòu)造函數(shù)里做。
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
...
}
class CoffeeMaker {
@Inject Heater heater;
@Inject Pump pump;
...
}
但是 @Inject 有他的局限性
以上 @Inject 的問(wèn)題都可以通過(guò) @Provides 來(lái)解決。 @Provides 修飾一個(gè)方法,這個(gè)方法會(huì)提供一個(gè)對(duì)象,在方法里我們自己實(shí)現(xiàn)如何實(shí)例化一個(gè)對(duì)象,如何配置。這個(gè)方法也可以有參數(shù),同 @Inject 修飾的構(gòu)造函數(shù),參數(shù)會(huì)被注入。
但是,@Inject 修飾的方法只能是一個(gè) Module 的方法可以是靜態(tài)的或者非靜態(tài)的。而這個(gè) Module 實(shí)際只是一個(gè)由 @Module 修飾的普通的類(lèi)。
約定,@Provides 修飾的方法命名以 provide 開(kāi)頭,@Module 修飾的類(lèi)以 Module 結(jié)尾。
@Module
class DripCoffeeModule {
@Provides static Heater provideHeater() {
return new ElectricHeater();
}
@Provides static Pump providePump(Thermosiphon pump) {
return pump;
}
}
@Inject 和 @Provides 修飾的類(lèi)組成了一個(gè)對(duì)象圖,而其中的元素因依賴(lài)而連接。而應(yīng)用的入口點(diǎn),就需要拿到這個(gè)圖的一個(gè)根的集合(這牽扯到數(shù)據(jù)結(jié)構(gòu)了,數(shù)據(jù)結(jié)構(gòu)里的樹(shù)有一個(gè)根,而圖可以有多個(gè)根,從這個(gè)根,連接到一系列節(jié)點(diǎn)構(gòu)成一顆樹(shù))。Dagger 通過(guò) Component 提供這個(gè)圖的根的集合。只有拿到 Component, Dagger 才能按照約定構(gòu)造所有依賴(lài)的實(shí)例。
Component 是一個(gè) @Component 修飾的接口,它定義一系列無(wú)參數(shù)方法,返回需要的類(lèi)型。Dagger 會(huì)生成它的實(shí)現(xiàn)類(lèi),該類(lèi)命名是在接口名前加 Dagger(如果你是用的Android Studio,要點(diǎn)編譯按鈕后才會(huì)生成實(shí)現(xiàn)類(lèi))。
@Component 注解還可以傳一個(gè)參數(shù),modules,即該 Component 所依賴(lài)的 Module。
@Component(modules = DripCoffeeModule.class)
interface CoffeeShop {
CoffeeMaker maker();
}
在應(yīng)用的入口點(diǎn),通過(guò) Component 的 builder 構(gòu)造 Component 的實(shí)例,需要手動(dòng)創(chuàng)建一個(gè) Module 的實(shí)例。
CoffeeShop coffeeShop = DaggerCoffeeShop.builder()
.dripCoffeeModule(new DripCoffeeModule())
.build();
我們一塊學(xué)習(xí)了 Dagger 中最基本的概念:
本文主要參考了,Dagger 官方文檔。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。