Dagger2使用攻略---通過生成的程式碼來理解相關概念
原文網址:http://blog.csdn.net/qq_17766199/article/details/50606011
Dagger2使用攻略
Dagger 2 是 Square 的 Dagger 分支,是一種依賴注入框架。目前由 Google 接手進行開發,Dagger2是使用程式碼自動生成和手寫程式碼來實現依賴注入。據說在 Dagger 的基礎上效率又提升了13%,並且同樣功能強大。
1.Gradle配置
(1)需要配置apt 外掛:(在project根目錄build.gradle
檔案中新增如下程式碼)
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
(2)新增依賴:(在modulebuild.gradle
檔案中新增如下程式碼)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
● 當前最新版本是2.0.2
● 如果在專案中同時用了Butterknife
,在Build時會報註釋衝突。
解決方法:(在modulebuild.gradle
檔案中新增如下程式碼)
- 1
- 2
- 3
- 1
- 2
- 3
(3)最後點選Build-->Make Project
就可以開始使用Dagger2
了。
2.Dagger2 常用註解
寫了一個簡單的Demo,下面根據Demo進行介紹。Dagger2要理解必須看Dagger 2自動生成的程式碼,Build後代碼在
專案-->app-->build-->generated-->source-->apt-->debug
目錄下。
1.Inject
@Inject
:在需要依賴的地方使用這個註解,告訴Dagger這個類或者欄位需要依賴注入,這樣Dagger會構造一個這個類例項來滿足依賴。
1.構造器注入:首先舉一個簡單的例子,無參構造方法。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
這個的侷限性是我們不能給這個類中的多個構造器作@Inject
註解。
2.註解成員變數:
接著上面我們要使用這個例項化類。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
這裡我們可以檢視生成的程式碼:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
同時我們也可以瞭解到@Inject Person mPerson;
為什麼不能使用private
。上面程式碼中的injectMembers
方法呼叫後面會說到。
3.方法注入
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
如當我們希望傳入類的當前例項(this引用)到被注入的依賴中。方法注入會在構造器呼叫後馬上被呼叫,所以這表示我們可以傳入完全被構造的this。
2.Module
@Module
:用來修飾類,表示此類的方法是用來提供依賴的,它告訴Dagger在哪裡可以找到依賴。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
@Provides
下面說到,@Singleton
單例,使用@Singleton
註解之後,物件只會被初始化一次,之後的每次都會被直接注入相同的物件。@Singleton
就是一個內建的作用域。
3.Provides
@Provides
:在@Module
中使用,我們定義的方法用這個註解,用於告訴
Dagger 我們需要構造例項並提供依賴。
為什麼要使用@Provides
,因為預設情況下,Dagger滿足依賴關係是通過呼叫構造方法得到的例項,比如上面的Person類使用。但是有時因為@Inject
的侷限性,我們不能使用@Inject
。比如構造方法有多個、三方庫中的類我們不知道他是怎麼實現的等等。例如下面程式碼中的SharedPreferences
,我們使用@Provides
返回一個建立好的例項,這樣做也顯得靈活不是嗎?
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
注意:
● 按照習慣 @Providers
方法都會用provide作為字首,@Module
類都用Module作為字尾。
● 如果@Provides
方法有引數,這個引數也要保證能夠被Dagger得到(例如通過其他的@Provides
方法或者@Inject註解的構造方法。)
4.Component
@Component
: 是@Inject
和@Module
的橋樑,需要列出所有的@Modules以組成該元件。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Dagger會按照上面介面生成一個實現類,生成類以Dagger為字首,提供builder()來生成例項。呼叫方法:(因為是單例,所以這裡放到了MyApplication)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
MainActivity程式碼: