依賴注入框架dagger2學習筆記

  1. 基本介紹

dagger2 是一款基于Java注解來實現的完全在編譯階段完成依賴注入的開源庫,主要用于模塊間解耦、提高代碼的健壯性和可維護性。

1.1 在android中如何使用

使用Gradle 引用dagger2依賴庫就可以

// Add Dagger dependenciesdependencies 
{
 compile 'com.google.dagger:dagger:2.x' 
annotationProcessor 'com.google.dagger:dagger-compiler:2.x'
}

2. 學習中的幾個疑惑

2.1 dagger2中的Inject,Component,Module,Provides等等都是什么東東,有什么作用?

Dagger2 通過注解來生成代碼,定義不同的角色,主要的注解如下:
@Module: Module類里面的方法專門提供依賴,所以我們定義一個類,用@Module注解,這樣Dagger在構造類的實例的時候,就知道從哪里去找到需要的依賴。
**@Provides: **在Module中,我們定義的方法是用這個注解,以此來告訴Dagger我們想要構造對象并提供這些依賴。
**@Inject: **通常在需要依賴的地方使用這個注解。換句話說,你用它告訴Dagger這個類或者字段需要依賴注入。這樣,Dagger就會構造一個這個類的實例并滿足他們的依賴。
**@Component: **Component從根本上來說就是一個注入器,也可以說是@Inject和@Module的橋梁,它的主要作用就是連接這兩個部分。將Module中產生的依賴對象自動注入到需要依賴實例的Container中。
@Scope: Dagger2可以通過自定義注解限定注解作用域,來管理每個對象實例的生命周期。
**@Qualifier: **當類的類型不足以鑒別一個依賴的時候,我們就可以使用這個注解標示。例如:在Android中,我們會需要不同類型的context,所以我們就可以定義 qualifier注解“@perApp”和“@perActivity”,這樣當注入一個context的時候,我們就可以告訴 Dagger我們想要哪種類型的context。

2.2 dagger2到底能帶來哪些好處?

最大的好處就是模塊間解耦

下面舉個簡單的例子:
如果在 Class A 中,有 Class B 的實例,則稱 Class A 對 Class B 有一個依賴。如果不用Dagger2的情況下我們應該這么寫:

 public class A {
  ... 
 B b;
  ... 
 public A() {
    b = new B(); 
 }
}

上面例子面臨著一個問題,一旦某一天B的創建方式(如構造參數)發生改變,那么你不但需要修改A中創建B的代碼,還要修改其他所有地方創建B的代碼。
有了dagger2 后,代碼風格變成這樣了

public class A{
    @InjectB b;
}

2.3 怎樣把dagger2應用到具體項目中?

3. dagger2 demo代碼

3.1 初始化User對象

這個很簡單, 就是創建一個普通的class

public class User {
    private String name;
    private int age;
    public User(String name ,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "user:" + name + ",age:" + age;
    }
}

3.2 生成UserModule 對象

/**
 *
 * module類就是給user初始化并且提供外部調用的類,這里類中我們需要給user初始,并且返回給dagger一個可調用的對象
 * @Module  真正提供依賴的類,以表明該類是Module類,這樣Dagger2才能識別 ,Dagger在構造類的實例的時候,就知道從哪里去找到需要的依賴。
 * @Provides 就是寫在Module中某些方法上,表示這個方法提供依賴
 *
 */
@Module
public class UserModule {
    @Provides
    User providerUser(){
        return new User("卡卡",20);
    }
}

3.3 生成Component對象

/**
 * 有了提供依賴的組件(module),我們還需要將依賴注入到需要的對象中。連接提供依賴和消費依賴對象的組件被稱為Injector。Dagger2中我們將這個對象其稱為component。
 *
 * @Component  也可以說是@Inject和@Module的橋梁,它的主要作用就是連接這兩個部分 , 將Module中產生的依賴對象自動注入到需要依賴實例的Container中。
 */
@Component(modules = UserModule.class)
public interface UserComponent {
    /**
     * 這里必須是真正消耗依賴的類型MainActivity,而不可以寫成其父類,比如Activity。
     *
     * 因為Dagger2在編譯時生成依賴注入的代碼,會到inject方法的參數類型中尋找可以注入的對象
     * @param activity
     */
    void inject(MainActivity activity);

}

3.4 完成依賴注入

public class MainActivity extends AppCompatActivity {

    /**
     * 使用@Inject標志被注入的對象User (注意User 不能為private)
     *
     * 換句話說,你用它告訴Dagger這個類或者字段需要依賴注入 ,這樣,Dagger就會構造一個這個類的實例并滿足他們的依賴
     */
    @Inject
    User user;// 不能是private

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv = (TextView) findViewById(R.id.user);

        UserComponent component = DaggerUserComponent.builder().userModule(new UserModule()).build();
        component.inject(this);

        tv.setText(user.toString());
    }
}

注意:
這里的DaggerUserComponent不是我們自己創建的,是dagger自動在build時(可手動make project)創建的,后邊的userModule也是更具你在Component設置的module對象生成的方法-如果不成功需先clean工程,再make project 一遍

4、小結

這兩天在網上看了不少有關dagger2的文章,現在雖然對它有了初步的認識,但是還有很多疑惑。
一個是還沒有領悟到這個框架的獨到之處,雖然它能起到一定解耦的效果,但是現在是感覺有點繁瑣。
還有一點就是,在實際項目中怎么用?現在還是一頭霧水、無從下手。

參考文檔

1、官方文檔
2、dagger2 — 基礎篇
3、daager2 — 初認識一
4、dagger2詳解 — 從代碼分析其原理
5、github 地址

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372

推薦閱讀更多精彩內容