Dagger2 使用記錄

Dagger是干嘛的呢管嬉?
我的理解:一個依賴注入(DI)框架童本,使用范圍是java和android舔涎。
DI--dependence inject。

本文主要是記錄Android項目中获列,使用Dagger2的一個簡單的demo谷市。如果需要Dagger入門的話,強(qiáng)烈推薦深入淺出Dagger2 : 從入門到愛不釋手系列击孩。

Dagger的優(yōu)點:

1.解耦迫悠。
2.簡化代碼。

Dagger注解

要使用Dagger首先必須了解相關(guān)的注解含義巩梢,下文主要介紹Dagger使用時创泄,最基本的的注解。

  • @Inject
    javax.inject.Inject
    翻譯過來就是“注入”的意思括蝠。

構(gòu)造函數(shù)注入:

public class Student {
    private String name;
    @Inject
    public Student() {
        this.name = "小美";
    }
    ...
}

屬性注入:

@Inject
User user;

被注入的屬性不能用private修飾鞠抑。標(biāo)記user對象為目標(biāo)依賴類。

方法注入:
依賴需要this對象的時刻可以提供安全的this對象忌警。

  • @Module
    dagger.Module
    通常自定義的類碍拆,可通過其在其構(gòu)造函數(shù)上添加@Injcet注解,實現(xiàn)對象的自動創(chuàng)建慨蓝,但是第三方依賴感混,不能給其中類添加@Injcet。因此Module應(yīng)運而生礼烈。
    Module其實是一個簡單工廠模式弧满,Module里面的方法基本都是創(chuàng)建類實例的方法。

  • @Component
    dagger.Component
    Component是注入器此熬,它一端連接目標(biāo)類庭呜,另一端連接目標(biāo)類依賴實例,它把目標(biāo)類依賴實例注入到目標(biāo)類中犀忱。

@Component(modules = ActivityModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

@Component(modules = ActivityModule.class)如何理解募谎?
上面已說明Component是注入器,并且是一個目標(biāo)類和目標(biāo)依賴實例的連接橋阴汇。而Module是創(chuàng)建類的工廠数冬。因此@Component(modules = ActivityModule.class)的含義就是ActivityModule.class為目標(biāo)類提供依賴實例,并通過MainComponent連接搀庶。

  • @Provides
    dagger.Provides
    Module中的創(chuàng)建類實例方法用Provides進(jìn)行標(biāo)注拐纱。
@Module
public class ActivityModule {
    @Provides
    public User provideUser(){
        return  new User("user from ActivityModule");
    }
   ...
}

  • 注解小結(jié):
    個人認(rèn)為@Component是Dagger2的核心注解铜异,因為其是目標(biāo)類和目標(biāo)依賴實例連接的橋梁,為方便理解將其當(dāng)作是注射器秸架,將目標(biāo)依賴實例注入到目標(biāo)類中揍庄。

Dagger2 使用

  • 添加Dagger庫
    Dagger主要是通過注解(annotation)及注解處理器實現(xiàn),因此需要添加兩個庫东抹,如下:
implementation 'com.google.dagger:dagger:2.+'
annotationProcessor 'com.google.dagger:dagger-compiler:2.+'

annotationProcessor:注解處理器蚂子。

  • Demo代碼
    (1)目標(biāo)依賴類
//User類
public class User {
    public String name;
    @Inject
    public User(){
    }
    public User(String name){
        this.name = name;
    }
}
//Student 類
public class Student {

    private String name;

    @Inject
    public Student() {
        this.name = "小美";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
//DaggerPresenter類
public class DaggerPresenter {

    MainActivity activity;
    User user;

    public DaggerPresenter(MainActivity activity,User user){
        this.user = user;
        this.activity = activity;
    }
    public void showUserName(){
        activity.showUserName(user.name);
    }
}

(2)提供目標(biāo)依賴實例的Module類
此處提供的是自定義依賴實例,一般用于提供第三方依賴類的實例缭黔。
自定義依賴類的實例提供缆镣,可通過@Inject注解實現(xiàn)。

@Module
public class ActivityModule {

    private MainActivity activity;

    public ActivityModule(MainActivity activity) {
        this.activity = activity;
    }

    @Provides
    public MainActivity provideActivity(){
        return  activity;
    }
    @Provides
    public User provideUser(){
        return  new User("user from ActivityModule");
    }
    @Provides
    public DaggerPresenter provideDaggerPresenter(MainActivity activity,User user) {
        return new DaggerPresenter(activity, user);
    }
}

(3)注射器類
MainComponent.java

//情況1
@Component(modules = ActivityModule.class)
public interface MainComponent {
    void inject(MainActivity activity);
}

//情況2:
@Component
public interface MainComponent {
    void inject(MainActivity activity);
}

需要Module提供目標(biāo)依賴實例的情況试浙,需要按照情況1定義Component董瞻。

自定義Component類后,build項目田巴,并自動編譯生成相關(guān)類钠糊。如下圖:


image.png

如果想更好的理解Dagger2的依賴注入原理,可查看上圖中的相關(guān)代碼壹哺。這里推薦# 淺析Dagger2依賴注入實現(xiàn)過程抄伍。

(4)注入目標(biāo)類

public class MainActivity extends AppCompatActivity {

    @Inject
    Student student;

    @Inject
    DaggerPresenter presenter;

    @Inject
    User user;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //*******關(guān)鍵代碼*******
        DaggerMainComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
        //*******關(guān)鍵代碼*******
        TextView tv = findViewById(R.id.tv);
        tv.setText(student.getName());
        presenter.showUserName();
    }

    public void showUserName(String name) {
        Toast.makeText(this,name,Toast.LENGTH_LONG).show();
    }
}

到此為此,dagger基本使用完成了管宵。但是我還是留了個知識點未講哦??截珍。

在demo中在User類中的構(gòu)造函數(shù)上,添加了@Inject箩朴,但是添加/不添加 并沒有區(qū)別岗喉。為什么呢( ⊙o⊙?)
因為在MainModule類中,提供了User類的實例創(chuàng)建方法炸庞。而注解處理器在編譯過程中钱床,是先去找Module中是否有User的實例創(chuàng)建方法,如果找到了埠居,則User的實例由此方法創(chuàng)建查牌。如果沒有找到,再去User類中滥壕,去找是否有@Inject標(biāo)記的構(gòu)造方法纸颜。
根據(jù)此原理可知,Student類中的@Inject不能刪除绎橘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁孙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浊洞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胡岔,死亡現(xiàn)場離奇詭異法希,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)靶瘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門苫亦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怨咪,你說我怎么就攤上這事屋剑。” “怎么了诗眨?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵唉匾,是天一觀的道長。 經(jīng)常有香客問我匠楚,道長巍膘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任芋簿,我火速辦了婚禮峡懈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘与斤。我一直安慰自己肪康,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布撩穿。 她就那樣靜靜地躺著磷支,像睡著了一般。 火紅的嫁衣襯著肌膚如雪食寡。 梳的紋絲不亂的頭發(fā)上齐唆,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音冻河,去河邊找鬼箍邮。 笑死,一個胖子當(dāng)著我的面吹牛叨叙,可吹牛的內(nèi)容都是我干的锭弊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼擂错,長吁一口氣:“原來是場噩夢啊……” “哼味滞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤剑鞍,失蹤者是張志新(化名)和其女友劉穎昨凡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚁署,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡便脊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了光戈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哪痰。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖久妆,靈堂內(nèi)的尸體忽然破棺而出晌杰,到底是詐尸還是另有隱情,我是刑警寧澤筷弦,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布肋演,位于F島的核電站,受9級特大地震影響烂琴,放射性物質(zhì)發(fā)生泄漏惋啃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一监右、第九天 我趴在偏房一處隱蔽的房頂上張望边灭。 院中可真熱鬧,春花似錦健盒、人聲如沸绒瘦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惰帽。三九已至,卻和暖如春父虑,著一層夾襖步出監(jiān)牢的瞬間该酗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工士嚎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留呜魄,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓莱衩,卻偏偏與公主長得像爵嗅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笨蚁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353