Dagger2學(xué)習(xí)筆記

什么是依賴(lài)注入

依賴(lài)注入(Dependency Injection)钥屈,簡(jiǎn)單理解A持有B的依賴(lài)讹开,通過(guò)構(gòu)造函數(shù)或者setter方法將B的實(shí)例傳入A就是依賴(lài)注入咐熙。

關(guān)于Dagger2

Dagger2是在編譯期根據(jù)注解通過(guò)APT自動(dòng)生成模板代碼的方式實(shí)現(xiàn)依賴(lài)注入挺举。編譯期注解比反射性能更好杀赢,解耦更徹底,方便測(cè)試湘纵。
github地址:https://github.com/google/dagger
官網(wǎng):https://dagger.dev/

使用

主要的注解:

  • @Inject 標(biāo)記被依賴(lài)對(duì)象的構(gòu)造方法和依賴(lài)方的成員變量
  • @Component 標(biāo)識(shí)依賴(lài)注入類(lèi)脂崔,該類(lèi)注入方法,參數(shù)為接收注入的對(duì)象
  • @Module 標(biāo)識(shí)依賴(lài)提供類(lèi)梧喷,其@Provides方法的返回值表示提供的依賴(lài)對(duì)象
  • @Provides 標(biāo)識(shí)@Module類(lèi)中的public方法砌左,方法帶參時(shí)dagger會(huì)遞歸查找參數(shù)被@Inject標(biāo)記的構(gòu)造方法以提供實(shí)例
  • @Scope 依賴(lài)注入對(duì)象的作用域,通過(guò)自定義被@Scope注解的注解可以控制依賴(lài)注入對(duì)象的作用范圍铺敌。@Singleton是它的一個(gè)默認(rèn)實(shí)現(xiàn)汇歹,其單例是在component的生命周期內(nèi),如果多個(gè)類(lèi)中用不同的component對(duì)象注入得到的是不同實(shí)例
  • @Qualifier 同@Name類(lèi)似适刀,如果有兩個(gè)@Provides方法的返回值一樣可以通過(guò)@Qualifier或者@Name區(qū)分
  • @Name
MVP+Dagger2

MVP應(yīng)該是android開(kāi)發(fā)應(yīng)用最廣泛的框架了秤朗,其將視圖層view、邏輯層presenter和數(shù)據(jù)層model分開(kāi)各自負(fù)責(zé)不同的功能笔喉,通過(guò)接口回調(diào)處理結(jié)果取视。結(jié)合Dagger后可以使解耦更加徹底硝皂,更加方便管理依賴(lài),但同時(shí)也提高了學(xué)習(xí)成本作谭,實(shí)現(xiàn)一個(gè)簡(jiǎn)單功能MVP原本就需要?jiǎng)?chuàng)建大量的類(lèi)現(xiàn)在更加復(fù)雜稽物。瑕不掩瑜,有人根據(jù)MVP和Dagger開(kāi)發(fā)了很多實(shí)用框架折欠,arms就是一個(gè)不錯(cuò)的框架 https://github.com/JessYanCoding/MVPArms 下面要寫(xiě)的就是一個(gè)簡(jiǎn)化版Demo

正文

已登錄為例首先創(chuàng)建MVP必要的組件LoginActivity贝或、LoginPresenter、LoginContract.View锐秦、LoginContract.Model
這里L(fēng)oginActivity不是真正的Activity只是為了方便說(shuō)明MVP模式

public class LoginActivity implements LoginContract.View {

    @Inject
    public LoginPresenter mPresenter;

    public LoginActivity() {
        
    }

    public void login(String id, String pwd) {
        // Presenter尚未注入咪奖,此時(shí)mPresenter為null
        mPresenter.login(id, pwd);
    }

    @Override
    public void refreshUI() {
        System.out.println("LoginActivity refresh UI");
    }

    public static void main(String[] args) {
        LoginActivity loginActivity = new LoginActivity();
        loginActivity.login("xiaoming", "123");
    }

}

成員變量持有LoginPresenter的依賴(lài),Dagger會(huì)根據(jù)@Inject注解優(yōu)先查找LoginPresenter被@Inject注解的構(gòu)造函數(shù)酱床,如果有參數(shù)就遞歸查找參數(shù)被@Inject注解的構(gòu)造函數(shù)

public class LoginPresenter extends BasePresenter<LoginContract.Model, LoginContract.View>{

    @Inject
    public LoginPresenter(LoginContract.Model model, LoginContract.View view) {
        super(model, view);
        System.out.println("LoginPresenter constructor is invoked");
    }


    public void login(String id, String pwd) {
        System.out.println("LoginPresenter login() id = "+id +", pwd = "+pwd);
        boolean login = mModel.login("id = " + id + ", pwd = " + pwd);
        if (login) {
            mRootView.refreshUI();
        }
    }
}
public interface LoginContract {


    interface View extends IView{
        void refreshUI();
    }

    interface Model extends IModel{
        boolean login(String params);
    }

}

回調(diào)接口View和Model由contract管理羊赵,LoginModel實(shí)現(xiàn)LoginContract.Model, presenter持有model依賴(lài)由dagger根據(jù)@Inject提供

public class LoginModel implements LoginContract.Model {

    @Inject
    public LoginModel() {
        System.out.println("LoginModel constructor is invoked");
    }

    @Override
    public boolean login(String params) {
        System.out.println("LoginModel login() is invoked params = "+params);
        return true;
    }
}

View實(shí)現(xiàn)在LoginActivity中,Component注入時(shí)傳入Module扇谣,由Module的provide方法提供

@Module
public class LoginModule {

    private LoginContract.View view;

    public LoginModule(LoginContract.View view) {
        this.view = view;
    }

    @Provides
    public LoginContract.View provideView() {
        return this.view;
    }

    @Provides
    public LoginContract.Model provideModel(LoginModel model) {
        return model;
    }
}

最后LoginComponent接口提供inject注入方法并指明提供依賴(lài)的Module

@Component(modules = LoginModule.class)
public interface LoginComponent {

    void inject(LoginActivity loginActivity);
}

以上各類(lèi)創(chuàng)建完成后編譯一下項(xiàng)目昧捷,Dagger會(huì)根據(jù)Component自動(dòng)生成類(lèi)名為Dagger+LoginComponent格式的注入類(lèi),在LoginActivity中完成注入

    public LoginActivity() {
        DaggerLoginComponent.builder()
                .loginModule(new LoginModule(this))
                .build()
                .inject(this);
    }

最后可以把部分常用代碼封裝進(jìn)基類(lèi)中

public class BaseActivity<P extends BasePresenter> {

    @Inject
    public P mPresenter;

    public BaseActivity() {

    }
}
public class BasePresenter<M extends IModel, V extends IView> {

    protected M mModel;
    protected V mRootView;

    public BasePresenter(M model, V view) {
        mModel = model;
        mRootView = view;
    }
}
結(jié)語(yǔ)

Dagger還有許多用法就不一一列舉了,最后還是感謝開(kāi)源感謝arms的作者(傳送門(mén)https://github.com/JessYanCoding)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末罐寨,一起剝皮案震驚了整個(gè)濱河市靡挥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸯绿,老刑警劉巖跋破,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異楞慈,居然都是意外死亡幔烛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)囊蓝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饿悬,“玉大人,你說(shuō)我怎么就攤上這事聚霜〗铺瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝎宇,是天一觀的道長(zhǎng)弟劲。 經(jīng)常有香客問(wèn)我,道長(zhǎng)姥芥,這世上最難降的妖魔是什么兔乞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上庸追,老公的妹妹穿的比我還像新娘霍骄。我一直安慰自己,他們只是感情好淡溯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布读整。 她就那樣靜靜地躺著,像睡著了一般咱娶。 火紅的嫁衣襯著肌膚如雪米间。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天膘侮,我揣著相機(jī)與錄音屈糊,去河邊找鬼。 笑死喻喳,一個(gè)胖子當(dāng)著我的面吹牛另玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播表伦,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼慷丽!你這毒婦竟也來(lái)了蹦哼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤要糊,失蹤者是張志新(化名)和其女友劉穎纲熏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锄俄,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡局劲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奶赠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼填。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毅戈,靈堂內(nèi)的尸體忽然破棺而出苹丸,到底是詐尸還是另有隱情,我是刑警寧澤苇经,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布赘理,位于F島的核電站,受9級(jí)特大地震影響扇单,放射性物質(zhì)發(fā)生泄漏商模。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望施流。 院中可真熱鬧凉倚,春花似錦、人聲如沸嫂沉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趟章。三九已至杏糙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚓土,已是汗流浹背宏侍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜀漆,地道東北人谅河。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像确丢,于是被迫代替她去往敵國(guó)和親绷耍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • dagger2的緣由背景 dagger2除了也有一段時(shí)間了鲜侥,但是現(xiàn)在各大開(kāi)源項(xiàng)目都在使用它褂始,雖然感覺(jué)他的用處并不是...
    vison123閱讀 425評(píng)論 0 1
  • Dagger2 轉(zhuǎn)載請(qǐng)注明原作者,如果你覺(jué)得這篇文章對(duì)你有幫助或啟發(fā)描函,可以關(guān)注打賞崎苗。 前言本文翻譯自Google ...
    輕云時(shí)解被占用了閱讀 6,686評(píng)論 4 31
  • 系列文章:Dagger2學(xué)習(xí)筆記(一)Dagger2學(xué)習(xí)筆記(二) 依賴(lài)注入是一種十分好的技巧,它能解偶高層次模塊...
    嘉偉咯閱讀 521評(píng)論 0 3
  • 前言 項(xiàng)目開(kāi)擼階段舀寓,準(zhǔn)備接入Dagger2胆数,再重新學(xué)起來(lái)!這篇文章主要是記錄對(duì)dagger2的學(xué)習(xí)互墓,從基本使用必尼,到...
    dashixun閱讀 289評(píng)論 0 0
  • 天黑不怕!我堅(jiān)信天終究會(huì)亮轰豆。 ————我是糖二組糖友“ 受傷的豬” 到現(xiàn)在我都清楚的記得胰伍, 7...
    糖世界閱讀 1,034評(píng)論 0 4