2015-07-11 94 views
20

Dagger 2優於Dagger 1有什麼優勢?Java依賴注入:Dagger 1 vs Dagger 2,哪個更好?

到目前爲止,我發現(剛剛)2:

  • 匕首2,您可以使用代碼混淆使用ProGuard
  • 匕首2更快(使用它的Android應用程序時,這是沒有太大的優勢,但它肯定一個重要的事情,如果你使用它的一些類型的服務器)

在同一時間,我發現了一個很大的缺點:你不能有模塊覆蓋(@Module(overrides = true))在匕首2,它在很大程度上是煩人至少對我來說 - 這真是你適合進行單元測試。

還有其他的優點和缺點嗎?

+1

*請不要詢問:產品或服務建議或比較* – Selvin

+0

您在此處詢問類似問題:http://stackoverflow.com/questions/31354735/how-to-migrate-missing-inject-from-module -with完成假-從匕首-1對。我認爲這篇文章應該是對那篇文章的編輯, –

+4

@Selvin 這樣的問題有時對社區有很大的價值,因爲他們將注意力集中在一個常見問題上,比如「選擇哪種Dagger DI以及爲什麼?」。我很抱歉違反你引用的規則,但也有「允許某些主觀問題」,「所有主觀問題預計都會有建設性」。 如果您的評論收到比當前更多的投票 - 我將刪除該問題。 – Ognyan

回答

15

一些優點和缺點從https://blog.gouline.net/2015/05/04/dagger-2-even-sharper-less-square/http://google.github.io/dagger/dagger-1-migration.html採取:匕首2

優點:

  • 沒有更多的思考 - 一切都爲具體的調用來完成(ProGuard的工作,沒有配置在所有)
  • 沒有更多的運行時圖組成 - 提高性能,包括每個請求的情況
  • 可追蹤 - 更好的生成代碼和沒有反射幫助使代碼r eadable且易於遵循
  • 支持除了字段和構造器注入其通過匕首支持的唯一兩種方法注射1個
  • 模塊需要更少的配置比匕首1
  • 允許用戶使用任何結構良好的範圍註解。 Dagger 1僅支持一個示波器:@Singleton

和缺點:

  • inject()方法現在有注射對象很強的類型關聯。這對調試很有幫助,但是它使從基類(例如基本活動,片段等)注入的常見做法複雜化。
  • 組件實現需要重建項目才能出現,並且任何注入相關的編譯錯誤都會導致類消失(即未生成)。
  • 不支持overrides。覆蓋簡單測試假冒的模塊可以創建模塊的子類來模擬該行爲。應該使用覆蓋並依賴依賴注入的模塊進行分解,以便覆蓋模塊代替兩個模塊之間的選擇。

編輯二○一六年十一月一十六日:這不是技術上的優勢,但匕首1現在已經過時(如2016年9月15日),並且將不再積極開發。他們建議遷移到Dagger 2.

+0

我找不到信息的來源了,但D2應該比D1快17%.. – Snicolas

+0

@Ognyan回答這個問題嗎?請考慮接受它!謝謝! – snafu109

2

我不會推薦看看toothpick

作爲合着者,我顯然是過度偏見,但是這個使用起來要簡單得多,至少在大多數情況下要比匕首快。實際上,範圍樹是開發更多高級功能的非常強大的方式,例如跨多個活動的範圍內的回收實例。

+0

你不會?那麼我會推薦牙籤 - 我已經使用過Dagger 2了,但是這個庫還沒有給我帶來什麼麻煩。 – npace