android框架--Dagger2

為什么用Dagger2

Dagger2 是一款使用在Java和Android上的依賴(lài)注入的一個(gè)類(lèi)庫(kù)。是通過(guò)依賴(lài)注入讓你少些很多公式化代碼屈糊,更容易測(cè)試,降低耦合拌滋,創(chuàng)建可復(fù)用可互換的模塊(核心和ButterKnife類(lèi)似都是少寫(xiě)不必要的代碼,更加優(yōu)雅)功能很強(qiáng)大,不僅僅只是找個(gè)id實(shí)現(xiàn)個(gè)點(diǎn)擊,當(dāng)然學(xué)習(xí)難度也是非常大了,不過(guò)如果只是簡(jiǎn)單實(shí)用也是很簡(jiǎn)單,這篇博客只是Dagger2的簡(jiǎn)單介紹實(shí)用,很多高級(jí)的功能以后在寫(xiě)了,具體很簡(jiǎn)單也就5步

1.配置信息

Project的build.gradle文件修改
增加2行

 //---dagger2-------
        classpath 'me.tatarka:gradle-retrolambda:3.2.4'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//---dagger2-------

Module下的build.gradle添加以下內(nèi)容:


//---dagger2-------
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'
//---dagger2-------
android {
 
    //---dagger2-------
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    //---dagger2-------
}

dependencies {
   
//---dagger2-------
    apt 'com.google.dagger:dagger-compiler:2.4'
    compile 'com.google.dagger:dagger:2.4'
    provided 'org.glassfish:javax.annotation:10.0-b28'
    //---dagger2-------

    compile 'com.google.code.gson:gson:2.4'
}

2.Dagger2基本使用

核心如圖一共三部分


依賴(lài)實(shí)例,提供方法的類(lèi)(這個(gè)類(lèi)是可以注入到需要的地方,)在使用的地方之間使用這個(gè)類(lèi)的方法就ok
@Inject 表示UserManager會(huì)被注入

public class UserManager {
    @Inject
    UserManager() {}
    public void test(final @NonNull Context context) {
        Toast.makeText(context, "test", Toast.LENGTH_SHORT).show();
    }
}

AppComponent是注入器,它一端連接目標(biāo)類(lèi)雌芽,另一端連接目標(biāo)類(lèi)依賴(lài)實(shí)例授艰,

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
  /**
   * 需要用到這個(gè)連接器的對(duì)象,就是這個(gè)對(duì)象里面有需要注入的屬性
   * (被標(biāo)記為@Inject的屬性)
   * 這里inject表示注入的意思世落,這個(gè)方法名可以隨意更改淮腾,但建議就
   * 用inject即可。
   */
  void inject(Dagger2Activity obj);
}

目標(biāo)類(lèi)

public class Dagger2Activity extends AppCompatActivity {
    //綁定TextView
    @BindView(R.id.test)
    TextView test;
    @Inject
    UserManager mUserManager;
    @Inject
    Gson g;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        // 使用Dagger2生成的類(lèi) 生成組件進(jìn)行構(gòu)造,并注入
        DaggerAppComponent.builder()
                .build()
                .inject(this);
    }
    @OnLongClick(R.id.test)    //給 設(shè)置一個(gè)長(zhǎng)按事件
    public boolean showToast2() {
        mUserManager.test(this);
        return true;
    }
    @OnClick(R.id.test)
    public void showToast() {
        List<Person> persons = new ArrayList<Person>();
        for (int i = 0; i < 5; i++) {
            Person p = new Person();
            p.setName("name" + i);
            p.setAge(i * 2);
            persons.add(p);
        }
        Toast.makeText(this, g.toJson(persons), Toast.LENGTH_SHORT).show();

    }

    class Person {

        private String name;
        private int age;

        /**
         * @return the name
         */
        public String getName() {
            return name;
        }

        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }

        /**
         * @return the age
         */
        public int getAge() {
            return age;
        }

        /**
         * @param age the age to set
         */
        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString()
        {
            return name + ":" +age;
        }
    }

備注

備注DaggerAppComponent是Dagger2生成的,自己新建的AppComponent注入器添加Dagger就可以,寫(xiě)完之后沒(méi)有這個(gè)類(lèi)需要Rebuild project或者先運(yùn)行一遍谷朝,AS會(huì)生成DaggerAppComponent就可以正常使用了

@Module

關(guān)于 @Inject Gson g;從哪里來(lái),為什么直接生成了gson
有時(shí)候我們并不能直接在構(gòu)造函數(shù)里面添加@Inject注解洲押,或者是我們?cè)陧?xiàng)目中引用第三方類(lèi)庫(kù)時(shí),也是無(wú)法直接在類(lèi)構(gòu)造函數(shù)中添加@Inject注解的圆凰,所以我們需要用到@Module注解了杈帐。這里的gso就是通過(guò)@Module注解獲取的
@Module
是用來(lái)生產(chǎn)實(shí)例來(lái)注入對(duì)象的,它類(lèi)似一個(gè)工廠专钉,集中創(chuàng)建要注入的類(lèi)的對(duì)象實(shí)例挑童。

@Module
public class AppModule {

  @Provides
  public Gson provideGson(){
    return new Gson();
  }
}

很簡(jiǎn)單的一個(gè)類(lèi)new Gson();生成的gson對(duì)象,提供給了目標(biāo)類(lèi)使用(備注provideGson這個(gè)名字可以隨便寫(xiě)但是最好自己能理解就可以)
在目標(biāo)類(lèi)里面直接共同@Inject Gson g;就可以獲取到gson了,別的就是正常使用

4最后

這里只是Dagger2的簡(jiǎn)單,使用,Dagger2功能很強(qiáng)大,所以要學(xué)的比較多,后續(xù)在寫(xiě)提高部分的了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跃须,隨后出現(xiàn)的幾起案子站叼,更是在濱河造成了極大的恐慌,老刑警劉巖菇民,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尽楔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡第练,警方通過(guò)查閱死者的電腦和手機(jī)阔馋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)复旬,“玉大人垦缅,你說(shuō)我怎么就攤上這事【园” “怎么了壁涎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)志秃。 經(jīng)常有香客問(wèn)我怔球,道長(zhǎng),這世上最難降的妖魔是什么浮还? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任竟坛,我火速辦了婚禮,結(jié)果婚禮上钧舌,老公的妹妹穿的比我還像新娘担汤。我一直安慰自己,他們只是感情好洼冻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布崭歧。 她就那樣靜靜地躺著,像睡著了一般撞牢。 火紅的嫁衣襯著肌膚如雪率碾。 梳的紋絲不亂的頭發(fā)上叔营,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音所宰,去河邊找鬼绒尊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仔粥,可吹牛的內(nèi)容都是我干的婴谱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼件炉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勘究!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斟冕,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤口糕,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后磕蛇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體景描,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年秀撇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了超棺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呵燕,死狀恐怖棠绘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情再扭,我是刑警寧澤氧苍,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站泛范,受9級(jí)特大地震影響让虐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罢荡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一赡突、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧区赵,春花似錦惭缰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至患整,卻和暖如春拜效,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背各谚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工紧憾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昌渤。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓赴穗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膀息。 傳聞我的和親對(duì)象是個(gè)殘疾皇子般眉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,520評(píng)論 25 707
  • 本文的分析基于dagger2的2.7版本。 谷歌開(kāi)發(fā)維護(hù)的Dagger2出來(lái)有很長(zhǎng)時(shí)間了潜支,目前在很多開(kāi)源項(xiàng)目上也能...
    sososeen09閱讀 13,587評(píng)論 31 108
  • 查理叔叔 村上春樹(shù)于1985年發(fā)表了《世界盡頭與冷酷仙境》甸赃。當(dāng)時(shí)日本國(guó)內(nèi)的純文學(xué)出版并不景氣,后來(lái)村上的其他作品在...
    查理叔叔與想象力工廠閱讀 18,970評(píng)論 6 25
  • 文/Z珍X惜 生活中的每一天都是多彩的冗酿,不同以往的埠对,所以隨時(shí)會(huì)出現(xiàn)很多這樣那樣的有時(shí)候。 很多時(shí)候裁替,生活是很美的项玛,...
    Z珍X惜閱讀 255評(píng)論 0 2
  • 十年了昌腰,你在我心里活生生的扎根了十年开伏,就算現(xiàn)在我們分隔兩地,你在我心里依舊還是那個(gè)位置還是那個(gè)樣子剥哑。 最近很喜歡回...
    羊老貓閱讀 1,486評(píng)論 4 1