寫作背景
這幾天在學習Dagger、MVP、Agera,這里所說的Dagger即Google接手的Dagger,也被稱作Dagger 2。跟著demo與一些技術博客學習,發(fā)現(xiàn)對于一個未曾使用過類似框架的人來說上手很困難,因此撰 初學Dagger 系列學習筆記,以一名初學者的視角來分享自己的學習經(jīng)驗,希望讓大家上手更順利。本文集將隨Winter的學習進度更新。
Hello Dagger
環(huán)境配置
我比較喜歡從功能入手來了解一個框架,所以讓我們從Hello Dagger開始吧。

如上圖,新建一個項目 Hello Dagger, 選擇 Empty Activity 模版。項目創(chuàng)建好后,在build.gradle(Project: HelloDagger)文件中的dependencies內(nèi)添加
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
在build.gradle(Module: app)文件中最外層的上方添加
apply plugin: 'com.neenbedankt.android-apt'
繼續(xù)在該文件內(nèi)的dependencies內(nèi)添加
// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'
這樣,Dagger的環(huán)境便配置好了,下面讓我們來開心地實現(xiàn)Hello Dagger.
代碼實現(xiàn)
官方的例子有點復雜,我表示看起來很吃力,所以,這里我們實現(xiàn)一個最簡單的Dagger demo就好了: 點擊按鈕,獲取Dagger注解的一個String,并顯示Toast。
首先,在activity_main布局中添加一個按鈕, 用于觸發(fā)事件,如下:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Say hello"/>
然后創(chuàng)建建一個類文件 AppModule
@Module
public class AppModule {
@Provides
String provideHello() {
return "hello dagger";
}
@Provides
@Named("hi")
String provideHi() {
return "hi dagger";
}
}
@Module : 依賴的提供者,通俗的說就是該類負責提供數(shù)據(jù)內(nèi)容;
@Provides : 負責提供值,被注解的方法提供返回參數(shù)類型的數(shù)據(jù),如果同一個module中多個provides返回參數(shù)類型一致,那么必須加@Named("xxx")以進行區(qū)分,其實xxx才是該provides的真正名字,方法名沒有什么意義。
再來創(chuàng)建一個接口文件 AppComponent
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
@Component :依賴的注入者,AppComponent在編譯時會自動生成 DaggerAppComponent文件,因為modules = {AppModule.class},所以DaggerAppComponent可以訪問AppModule.class內(nèi)的內(nèi)容,接口內(nèi)有方法 void inject(MainActivity activity) ,所以該接口也可以訪問MainActivity,因而可以成為MainActivity與AppModule.class之間的橋梁。
先編譯一下,使AppComponent生成DaggerAppComponent文件,接著在MainActivity的onCreate()方法內(nèi)添加以下代碼
DaggerAppComponent.builder()
.appModule(new AppModule())
.build()
.inject(this);
這樣一來,AppModule內(nèi)的內(nèi)容便注入到MainActivity中了,現(xiàn)在我們可以在MainActivity中訪問AppModule里面的內(nèi)容了,訪問方式如下,在MainActivity中添加全局變量
@Inject
String hello;
@Inject
@Named("hi")
String hi;
@Inject :需要注入依賴的地方,Dagger 會構(gòu)造一個該類的實例并滿足它所需要的依賴,通俗地說就是該變量被初始化為AppModule中@Provides且同類型同名(@Named相同)的方法的返回值了。
感覺還是挺神奇,這里為了方便把注入寫在MainActivity中了,如果在Application中注入,那么僅需初始化一次,該Application下的所有類都能訪問了。
好了,為按鈕添加點擊事件,并showToast看看。
Demo地址如下:
https://github.com/XunMengWinter/HelloDagger