新聞中心
Dagger 和 Koin 無疑是 Android 中最流行的兩個(gè)依賴注入框架。這兩個(gè)庫具有相同的用途,而且看起來非常相似,但它們在底層的工作方式卻非常不同。

站在用戶的角度思考問題,與客戶深入溝通,找到潼關(guān)網(wǎng)站設(shè)計(jì)與潼關(guān)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋潼關(guān)地區(qū)。
那么 Hilt 是什么呢?Hilt 是一個(gè)內(nèi)部使用 Dagger 的庫,只是簡化了它的用法,因此我在這里所說的有關(guān) Dagger 的內(nèi)容也適用于 Hilt。在本文中,我不會告訴您應(yīng)該選擇哪個(gè)庫。相反,我想向您展示它們的本質(zhì)區(qū)別以及這些差異對您的應(yīng)用造成的影響。
Dagger
如果我們希望 Dagger 提供某個(gè)類的實(shí)例,我們要做的就是在構(gòu)造函數(shù)中添加 @Inject 注解。
添加這個(gè)注解后,Dagger 會在構(gòu)建時(shí)為這個(gè)類生成一個(gè) Factory。在該用例下,由于它的類名是 CompositeAdapter, 它會生成一個(gè)名為 CompositeAdapter**_**Factory的類。
此類包含創(chuàng)建 CompositeAdapter 類的實(shí)例所需的所有信息。
如你所看到該工廠類實(shí)現(xiàn)了 get() 并返回了一個(gè)新的 CompositeAdapter 實(shí)例。這實(shí)際上是此類實(shí)現(xiàn)的 Provider
如果我們用 Hilt 代替 Dagger 呢?
在這個(gè)例子中,沒有任何區(qū)別。Hilt 是一個(gè)內(nèi)部使用 Dagger 的庫,我向你展示的類是由 Dagger 生成的。如果您使用 Hilt,它確實(shí)為我們生成了一些額外的類,這些類簡化了 Dagger 的使用,并減少了我們需要編寫的樣板代碼的數(shù)量。但核心部分保持不變。
Koin
Koin 與 Dagger 以及 Hilt 相比,管理依賴項(xiàng)的方法完全不同。要在 Koin 中注冊依賴項(xiàng),我們不會使用任何注解,因?yàn)镵oin不會生成任何代碼。相反,我們必須為模塊提供工廠,這些模塊將用于創(chuàng)建項(xiàng)目中所需的每個(gè)類的實(shí)例。
Koin 將這些工廠類的引用添加到 InstancesRegistry 類中,該類包含對我們編寫的所有工廠的引用。
該 map 中的 key 是類的全名或使用命名參數(shù)時(shí)提供的名稱。對應(yīng)的值是我們編寫的工廠,將用于創(chuàng)建類的實(shí)例。
要獲得依賴關(guān)系,我們需要調(diào)用 get() (比如在一個(gè)工廠類中) 或者通過在 activities 或 fragments 中調(diào)用 inject() 委托屬性 ,從而懶加載 get()。get()方法將查找為給定類型的類注冊工廠,并將其注入其中。
有什么影響?
Dagger 生成代碼來提供依賴,而 Koin 不生成代碼,這實(shí)際上帶來了一些影響。
1. 錯(cuò)誤處理
因?yàn)镈agger 是一個(gè)編譯時(shí)依賴注入框架,如果我們忘記提供某些依賴,我們幾乎會立即知道我們的錯(cuò)誤,因?yàn)槲覀兊捻?xiàng)目將構(gòu)建失敗。
例如,如果我們忘記向構(gòu)造函數(shù)的 CompositeAdapter 中添加 @Inject 注解,并嘗試將其注入 fragment 中,則構(gòu)建將失敗,并顯示適當(dāng)?shù)腻e(cuò)誤,確切地告訴我們出了什么問題。
在 Koin 中的情況有所不同,因?yàn)樗粫扇魏未a。如果我們忘記為 CompositeAdapter 類添加工廠,應(yīng)用將會成功構(gòu)建,但是會拋出 RuntimeException 一旦我們請求獲取這個(gè)類的實(shí)例。它可能會在應(yīng)用啟動時(shí)發(fā)生,因此我們可能會立即注意到它,但也可能稍后在其他屏幕上或當(dāng)用戶執(zhí)行某些特定操作時(shí)發(fā)生。
2. 對構(gòu)建時(shí)間的影響
Koin 不生成任何代碼的優(yōu)點(diǎn)是:它對我們的構(gòu)建時(shí)間的影響要小得多。Dagger 需要使用注解處理器來掃描代碼并生成適當(dāng)?shù)念悺_@可能需要一些時(shí)間,可能會減慢我們的構(gòu)建。
3. 對運(yùn)行時(shí)性能的影響
從另一方面來說,因?yàn)?Koin 在運(yùn)行時(shí)解析依賴項(xiàng),所以它的運(yùn)行時(shí)性能稍差一些。
到底相差多少呢?為了估算性能差異我們可以使用該庫,其中 Rafa Vázquez 基于不同的設(shè)備上測量并比較了這兩個(gè)庫。測試數(shù)據(jù)的編寫方式可以模擬多個(gè)級別的傳遞依賴關(guān)系,因此它不僅僅是具有 4 個(gè)類的虛擬應(yīng)用程序。
如您所見,Dagger 對啟動性能幾乎沒有影響。另一方面,在 Koin 中,我們可以看到它花費(fèi)了很多時(shí)間。在 Dagger 中注入依賴也比在 Koin 中快一些。
總結(jié)
正如我在本文開始時(shí)所說的,我這里的目標(biāo)不是告訴您要使用哪個(gè)庫。我在兩個(gè)不同的大項(xiàng)目中都使用了 Koin 和 Dagger。老實(shí)說,我認(rèn)為選擇 Dagger 還是 Koin 并不重要,重要的是能夠讓你編寫干凈、簡單且易于單元測試的代碼。我認(rèn)為所有的庫:Koin,Dagger 和 Hilt 都達(dá)到了這個(gè)目的。
所有這些庫都有自己的優(yōu)勢,我希望了解它們在底層是如何工作的,能夠幫助您自己決定哪種庫最適合您的應(yīng)用。
分享文章:Android注解三大框架Dagger、Hilt和Koin有何不同?
文章網(wǎng)址:http://fisionsoft.com.cn/article/dpocipi.html


咨詢
建站咨詢
