dagger2 循序漸進學習(包會)(二)

文章索引
dagger2 循序漸進學習(一)依賴注入基礎知識(包會)
dagger2 循序漸進學習(二)
dagger2 循序漸進學習(三) 實例1,application中的應用

昨天寫了關(guān)于dagger2 的重要但比較易于理解的基礎知識 依賴注入豪墅,這里是鏈接dagger2 循序漸進學習(一)依賴注入基礎知識判呕。
今天這篇就開始主要講dagger2 本身了改执,遵循循序漸進簡單易懂的原則体谒,所以要花費一定篇幅填抬。

那么首先要明確了解一下dagger2是什么:
Dagger1
這個版本不是這篇文章的重點,所以我只是簡略地說一下辆童。不管怎樣宜咒,Dagger1還是做了很多的貢獻,可以說是如今Android上最流行的依賴注入框架把鉴。它是由Square公司受到Guice啟發(fā)創(chuàng)建的故黑。
基本特點:
多個注入點:依賴,通過injected
多種綁定方法:依賴庭砍,通過provided
多個modules:實現(xiàn)某種功能的綁定集合
多個對象圖: 實現(xiàn)一個范圍的modules集合

Dagger1是在編譯的時候?qū)嵭薪壎ǔ【В贿^也用到了反射機制。但這個反射不是用來實例化對象的怠缸,而是用于圖的構(gòu)成诗轻。Dagger會在運行的時候去檢測是否一切都正常工作,所以使用的時候會付出一些代價:偶爾會無效和調(diào)試困難揭北。
Dagger2
Dagger2是Dagger1的分支扳炬,由谷歌公司接手開發(fā),目前的版本是2.0搔体。Dagger2是受到AutoValue項目的啟發(fā)恨樟。 剛開始,Dagger2解決問題的基本思想是:利用生成和寫的代碼混合達到看似所有的產(chǎn)生和提供依賴的代碼都是手寫的樣子疚俱。
如果我們將Dagger2和1比較劝术,他們兩個在很多方面都非常相似,但也有很重要的區(qū)別计螺,如下:
再也沒有使用反射:圖的驗證夯尽、配置和預先設置都在編譯的時候執(zhí)行。
容易調(diào)試和可跟蹤:完全具體地調(diào)用提供和創(chuàng)建的堆棧
更好的性能:谷歌聲稱他們提高了13%的處理性能
代碼混淆:使用派遣方法登馒,就如同自己寫的代碼一樣

當然所有這些很棒的特點都需要付出一個代價匙握,那就是缺乏靈活性,例如:Dagger2沒用反射所以沒有動態(tài)機制陈轿。

是不是蒙蔽了??!!
廢話少說圈纺,上代碼,來看下如何找Android 中使用dagger2麦射。
首先在整個項目的gradle文件中加入即時編譯生成代碼的apt插件依賴(或者也可以寫到下面moudel的gradle文件中)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'//這里是添加的蛾娶,也可以寫到下面moudel的gradle文件中
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

然后在moudel的gradle文件中加入相關(guān)依賴:

apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt' //加入即時編譯插件apt
android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "zhangzhe.daggerdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    testCompile 'junit:junit:4.12'

    apt 'com.google.dagger:dagger-compiler:2.0'//這里是添加的
    compile 'com.google.dagger:dagger:2.0'//這里是添加的
    provided 'javax.annotation:jsr250-api:1.0'//這里是添加的
}

先不講dagger2的理論一些名稱直接擼代碼;
以Android當前流行的mvp模式為例潜秋,寫一個簡要的登錄demo蛔琅。

1.先建立登錄的activity 作為view層;

public class LoginActivity extends AppCompatActivity  {
 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
  
}
}

2.建立ILoginContract協(xié)議接口峻呛,定義view層和presenter層的邏輯罗售。

public interface ILoginContract {
interface ILoginPresenter {
    void login(String name,String pwd);
}

interface ILoginView<ILoginPresenter>{
    void loginok();
    void loginErro();
}

}

3.建立presenter的實現(xiàn)類

public class LoginPresenter implements     ILoginContract.ILoginPresenter {
ILoginContract.ILoginView view;


public LoginPresenter(ILoginContract.ILoginView view) {
    this.view = view;
}

@Override
public void login(String name, String pwd) {

}
}

我們按常規(guī)的方式會把LoginPresenter 在activity中聲明成員變量辜窑,并new 出來如下:

 public class LoginActivity extends AppCompatActivity  implements ILoginContract.ILoginView{
    
   LoginPresenter  presenter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
       presenter = new LoginPresenter(this);//這里有問題
    }

    @Override
    public void loginok() {

    }

    @Override
    public void loginErro() {

    }
}

如上,這里的presenter是new出來的寨躁,達到互相依賴的關(guān)系穆碎,這樣就把彼此僅僅的耦合在一起了,一旦presenter的構(gòu)造方法改變就要同時改變activity中的代碼职恳,這不是我們想要的所禀。
那么dagger2 是如何注入的呢;
首先我們需要新建兩個類文件:
Moudule類

@Module
public class LoginMoudule {
private final ILoginContract.ILoginView view;
public LoginMoudule(ILoginContract.ILoginView view) {
    this.view = view;
}
@Provides
ILoginContract.ILoginView provideLoginView(){
    return view;
}
}

Component類

@Component(modules = LoginMoudule.class)
public interface LoginComponent {
 void inject(LoginActivity activity);
}

可見moudule類用@Module 注解放钦,構(gòu)造方法中注入view層色徘, 并用@Provides注解一個返回ILoginView的方法;Component類用@Component(modules = LoginMoudule.class)注解可見Component與LoginMoudule.class必然存在某種關(guān)系操禀,并inject方法把activity聯(lián)系起來贺氓,這樣這幾個類就肯定通過某種方法聯(lián)系起來了,但這些聯(lián)系并不需要我們程序員去寫什么了床蜘。

接下來就是對view和presenter兩個類內(nèi)部進行改造:activity

public class LoginActivity extends AppCompatActivity  implements ILoginContract.ILoginView{
    @Inject//這里加注解
    LoginPresenter presenter;


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

    @Override
    public void loginok() {

    }

    @Override
    public void loginErro() {

    }
}

presenter類

public class LoginPresenter implements ILoginContract.ILoginPresenter {
ILoginContract.ILoginView view;

@Inject//這里注解
public LoginPresenter(ILoginContract.ILoginView view) {
    this.view = view;
}

@Override
public void login(String name, String pwd) {
}
}

在activity中的依賴的presenter添加@Inject注解,同時在presenter中的構(gòu)造方法同時加這個@Inject的注解蔑水,之后build一下整個項目邢锯,在項目的project視圖下的build的文件夾下生成了如下的幾個類,這就是dagger2 通過apt生成的輔助類搀别,也是dagger2的玄機所在丹擎。

Paste_Image.png

回到activity中:

public class LoginActivity extends AppCompatActivity  implements ILoginContract.ILoginView{
    @Inject
    ILoginContract.ILoginPresenter presenter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
//添加此句
        DaggerLoginComponent.builder().loginMoudule(new LoginMoudule(this)).build().inject(this);
    }

    @Override
    public void loginok() {

    }

    @Override
    public void loginErro() {

    }
}

dagger2生成的義Dagger前綴的Component內(nèi)部完成了這一系列注入過程。
到此為止mvp中v和p的互相注入通過dagger2已經(jīng)完成歇父,此時可以測試一下蒂培,看presenter是否會報空指針。你可能會說了榜苫,wtf(what the fuck)這么麻煩;ご痢!呵呵垂睬,和我一開始一樣的媳荒。但是想想框架不一定就是能滿足程序員的懶,框架麻煩但是能讓我們的程序更健壯驹饺,或者維護起來會省很多事扒怼!想你說的 赏壹,懶鱼炒!沒辦法。
好今天就到這里蝌借,接下來會詳細介紹dagger2 的細節(jié)昔瞧,每天學一點點指蚁,厚積薄發(fā)。

每天發(fā)的東西都是我正在學習的東西硬爆,學習的同時欣舵,與更多人分享,一能增進我的記憶缀磕,同時提出自己的見解與大家互相促進提高缘圈,同時也希望收到拍磚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市袜蚕,隨后出現(xiàn)的幾起案子糟把,更是在濱河造成了極大的恐慌,老刑警劉巖牲剃,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遣疯,死亡現(xiàn)場離奇詭異,居然都是意外死亡凿傅,警方通過查閱死者的電腦和手機缠犀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聪舒,“玉大人辨液,你說我怎么就攤上這事∠洳校” “怎么了滔迈?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長被辑。 經(jīng)常有香客問我燎悍,道長,這世上最難降的妖魔是什么盼理? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任谈山,我火速辦了婚禮,結(jié)果婚禮上宏怔,老公的妹妹穿的比我還像新娘勾哩。我一直安慰自己,他們只是感情好举哟,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布思劳。 她就那樣靜靜地躺著,像睡著了一般妨猩。 火紅的嫁衣襯著肌膚如雪潜叛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音威兜,去河邊找鬼销斟。 笑死,一個胖子當著我的面吹牛椒舵,可吹牛的內(nèi)容都是我干的蚂踊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼笔宿,長吁一口氣:“原來是場噩夢啊……” “哼犁钟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泼橘,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤涝动,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炬灭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體醋粟,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年重归,在試婚紗的時候發(fā)現(xiàn)自己被綠了米愿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鼻吮,死狀恐怖吗货,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狈网,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布笨腥,位于F島的核電站拓哺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脖母。R本人自食惡果不足惜士鸥,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谆级。 院中可真熱鬧烤礁,春花似錦、人聲如沸肥照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舆绎。三九已至鲤脏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背猎醇。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工窥突, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硫嘶。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓阻问,卻偏偏與公主長得像,于是被迫代替她去往敵國和親沦疾。 傳聞我的和親對象是個殘疾皇子称近,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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