依賴注入框架dagger2學(xué)習(xí)筆記

  1. 基本介紹

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

1.1 在android中如何使用

使用Gradle 引用dagger2依賴庫(kù)就可以

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

2. 學(xué)習(xí)中的幾個(gè)疑惑

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

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

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

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

下面舉個(gè)簡(jiǎn)單的例子:
如果在 Class A 中,有 Class B 的實(shí)例,則稱 Class A 對(duì) Class B 有一個(gè)依賴。如果不用Dagger2的情況下我們應(yīng)該這么寫:

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

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

public class A{
    @InjectB b;
}

2.3 怎樣把dagger2應(yīng)用到具體項(xiàng)目中?

3. dagger2 demo代碼

3.1 初始化User對(duì)象

這個(gè)很簡(jiǎn)單, 就是創(chuàng)建一個(gè)普通的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 對(duì)象

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

3.3 生成Component對(duì)象

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

}

3.4 完成依賴注入

public class MainActivity extends AppCompatActivity {

    /**
     * 使用@Inject標(biāo)志被注入的對(duì)象User (注意User 不能為private)
     *
     * 換句話說,你用它告訴Dagger這個(gè)類或者字段需要依賴注入 ,這樣,Dagger就會(huì)構(gòu)造一個(gè)這個(gè)類的實(shí)例并滿足他們的依賴
     */
    @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不是我們自己創(chuàng)建的,是dagger自動(dòng)在build時(shí)(可手動(dòng)make project)創(chuàng)建的,后邊的userModule也是更具你在Component設(shè)置的module對(duì)象生成的方法-如果不成功需先clean工程,再make project 一遍

4、小結(jié)

這兩天在網(wǎng)上看了不少有關(guān)dagger2的文章,現(xiàn)在雖然對(duì)它有了初步的認(rèn)識(shí),但是還有很多疑惑。
一個(gè)是還沒有領(lǐng)悟到這個(gè)框架的獨(dú)到之處,雖然它能起到一定解耦的效果,但是現(xiàn)在是感覺有點(diǎn)繁瑣。
還有一點(diǎn)就是,在實(shí)際項(xiàng)目中怎么用?現(xiàn)在還是一頭霧水、無(wú)從下手。

參考文檔

1、官方文檔
2、dagger2 — 基礎(chǔ)篇
3、daager2 — 初認(rèn)識(shí)一
4、dagger2詳解 — 從代碼分析其原理
5、github 地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容