Dagger2 @Inject @Provide @Module @Component簡單使用

本文適合于Dagger2 零基礎(chǔ)學(xué)習(xí)。本次閱讀需要五分鐘。

Dagger2 主要提供了6種注解,這里我主要講其中的四種
@Inject @Provide @Module @Component

Dagger2是通過依賴注入完成類的初始化。

**這個過程需要三部分:
依賴提供方,依賴注入容器,依賴需求方
**

  1. @Inject Inject主要有兩個作用
    1.作為依賴注提供方使用:在構(gòu)造函數(shù)上,通過標(biāo)記構(gòu)造函數(shù)讓Dagger2來使用(Dagger2通過Inject標(biāo)記可以在需要這個類實例的時候來找到這個構(gòu)造函數(shù)并把相關(guān)實例new出來)從而提供依賴
    2.作為依賴需求方:標(biāo)記在需要依賴的變量Dagger2會幫助初始化,被我們使用。

  2. @Provide 用Provide來標(biāo)注一個方法,該方法可以在需要提供依賴時被調(diào)用,從而把預(yù)先提供好的對象當(dāng)做依賴給標(biāo)注了@Inject的變量賦值。provide主要用于標(biāo)注Module里的方法

  3. @Module 用Module標(biāo)注的類是專門用來提供依賴的。注意Module類是提供依賴的一個集合,通常它自身是需要被依賴的。而真正被依賴的都是通過@Provide標(biāo)注的方法提供,所以@Module和@Provide是聯(lián)合使用的。

  4. @Component Component一般用來標(biāo)注接口,被標(biāo)注了Component的接口在編譯時會產(chǎn)生相應(yīng)的類的實例來作為提供依賴方和需要依賴方之間的橋梁,把相關(guān)依賴注入到其中。


    圖片來自于[Maydaaa](https://dreamerhome.github.io/2016/07/11/dagger%20for%20code/)

**對上述內(nèi)容請記住依賴注入過程需要三部分:
依賴提供方,依賴注入容器,依賴需求方
**
對上述描述不清楚的,請先看下面的案例,再去理解上面的內(nèi)容。

案例

常規(guī)做法
我們要在TestUser 中創(chuàng)建一個User

public class User {
    String userName;
    int age;
}

如果我們想使用User 我們需要new出來然后使用

 public class TestUser {
    User user;
    public static void main(String[] arg) {
        TestUser testUser = new TestUser();
        testUser.user = new User();
        testUser.user.userName = "name";
    }
}

在上述例子中我們?nèi)绻M褂肬ser我們需要new一個User然后才能使用

下面我們通過Dragger2去完成上述過程

  • 依賴注入方
    通過@Inject和@Module&&@Provide可以去完成依賴注入方
    先講@Module&&@Provide
    我們在TestUser 中想使用User那么我們需要一個Model我們的@Model是用在類上的。
    我們創(chuàng)建了一個@Module TestUserModule

    @Module
    public class TestUserModule {
     @Provides
      User provideUser(){
          return new User();
      }
    }
    

我們通過上述代碼就完成的依賴注入方。這里解釋一下@Module是一個依賴提供方的合集,本身一般是不作為內(nèi)容被提供的。User才是我們需要提供的內(nèi)容
比如我們現(xiàn)在希望TestUserModule 同時提供一個Account
@Module
public class TestUserModule {
@Provides
User provideUser(){
return new User();
}
@Provides
Account provideAccount(){
return new Account();
}
}

  • 依賴注入容器
    依賴注入容器只是一個接口,用來描述被注入的對象TestUser 需要哪些modules = TestUserModule.class
    @Component(modules = TestUserModule.class)
    public interface TestUserComponent {
    void inject(TestUser testUser);
    }
    注入容器本身只是一個接口interface
  • 依賴需求方
    public class TestUser {
    @Inject
    User user;
    public static void main(String[] arg) {
    TestUser testUser = new TestUser();
    DaggerTestUserComponent.builder().build().inject(testUser);
    System.out.println(testUser.user.name);
    }
    }
    我們要打印出name System.out.println(testUser.user.name);
    在使用User前要做兩件事情
  1. DaggerTestUserComponent.builder().build().inject(testUser);
    DaggerTestUserComponent是在編譯后編譯器幫我們生成的。生成的格式是Dagger+我們自定義的容器
  2. @Inject
    User user;
    通過我們剛剛的DaggerTestUserComponent.builder().build().inject(testUser);Dagger2會幫我們把user初始化。

注意事項
@Module
Dagger2是怎么選擇依賴提供的呢,規(guī)則是這樣的:

步驟1:查找Module中是否存在創(chuàng)建該類的方法。
步驟2:若存在創(chuàng)建類方法,查看該方法是否存在參數(shù)
步驟2.1:若存在參數(shù),則按從步驟1開始依次初始化每個參數(shù)
步驟2.2:若不存在參數(shù),則直接初始化該類實例,一次依賴注入到此結(jié)束
步驟3:若不存在創(chuàng)建類方法,則查找Inject注解的構(gòu)造函數(shù),看構(gòu)造函數(shù)是否存在參數(shù)
步驟3.1:若存在參數(shù),則從步驟1開始依次初始化每個參數(shù)
步驟3.2:若不存在參數(shù),則直接初始化該類實例,一次依賴注入到此結(jié)束
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 部分內(nèi)容參考自:[Android]使用Dagger 2依賴注入 - DI介紹(翻譯)[Android]使用Dagg...
    AItsuki閱讀 47,789評論 66 356
  • 本文的分析基于dagger2的2.7版本。 谷歌開發(fā)維護(hù)的Dagger2出來有很長時間了,目前在很多開源項目上也能...
    sososeen09閱讀 13,659評論 31 108
  • 幾個問題 看到Dagger2這個詞的時候,相信很多人會有很多的疑問如下:Dagger2如何使用在例子中?Injec...
    codeHoward閱讀 7,074評論 4 10
  • 文/夫子閑云 霧鎖青山雨浸夜,蟲蛙無聲鳥停歇。 林間自在忘金籠,恰如曹公思喬色。 天若傷身雷如烈,亭間魚戲藕搖曳。...
    夫子閑云孫寧富閱讀 193評論 0 0
  • 「 那大概不是愛情。 那大概不是友情。 那大概也不是親情。 那是一種超越這一切的感情。 那一年,是他來到這個世界之...
    想說_H閱讀 258評論 0 0