Dagger2入门探索

在开始使用Dagger2之前有些概念还是要弄清楚的,主要就是Inject,Component,Module,Provides四大金刚.

  • Inject注入 --> 例如在MainActivity中需要一个A对象,那我们是不是需要声明一个A对象,平常的话我们就是A a ;那如果使用Dagger2的话,我们就需要使用@Inject注解来注入对象,用法为

       @Inject 
         A a;
    
  • Component桥梁 --> 连接需求方需要注入的对象(就是上面的A对象)和提供方提供的相应对象的实例

  • Module工厂 --> 生产相应的对象实例.

  • Provides提供商 --> 一个对象(A)生产出来以后,要由提供商(Provide)提供给管理者(Component),它会将其交到Inject手中.

    以下是这四个的结合过程:


    四大金刚的传递过程.png

当然上面的过程是存在问题的,不过不是结合过程有什么问题,而是还需要补充生命周期的注解.下面就讲讲Scope的含义:

  • Scope简单的来说就是能起到一个绑定生命周期的作用(需要特别注意的是,如果你不绑定的话,那么如果你在Activity中多次调用注入对象的话,那么每一个对象其实是不同的).
    举例来说:我们在AppComponent(对应Application的Component,一般初始化一些全局单例)中标注了自定义的Scope注解(Scope为接口,我们需要自定义,只要是Scope都具有相同的功能,取名为Singleton是为了方便我们的记忆)中提供了一个A对象,A对象由AppModule生产,我们需要在自定义的一个Application子类中初始化AppComponent,比如:

    DaggerAppComponent.builder().appModule(new AppModule(this)).build();
    

那么当前对象a就和Application绑定,即生命周期相同.案例代码:

    /**
     * @Component(modules = {AppModule.class})
     * 上面这句话有两个含义:
     *      一当前接口担任桥梁角色,即连接需求方需要注入的对象和提供方提供的相应对象的实例
     *      二即当前桥梁管理着AppModule,AppModule里面主要就是提供相应的对象实例(AppModule类似一个工厂,专门生产我们需要的对象)
     */
    @Singleton
    @Component(modules = {AppModule.class})
    public interface AppComponent {
          A getA();
    }

    /**
      * 这里被AppComponent管理的module
      */
    @Module
    public class AppModule {

          Context mContext;

      public AppModule(Context context) {
          this.mContext = context;
      }

    //@Singleton为Scope的子类(这个自带的,不用我们自定义),指定A对象的生命周期和使用到A的目标类的生命周期相同
      @Singleton
      @Provides
      public A provideA(){
          return new A(mContext);
      }
    }

现在比较常见的自定义一些绑定生命周期的Scope,就是PerActivity,PerFragment(这么起名字是为了见名知意)方法如下:

  @Scope
  @Retention(RetentionPolicy.RUNTIME)
  public @interface PerActivity {
  }

除了上面这些,常见的还有在Component中配置了一个dependencies = XxxComponent属性,它的意思简单理解就是当前Component依赖XxxComponent,这样当我们需要使用到XxxComponent中的对象时,就可以拿来用,需要注意的是使用的在初始化当前Component的时候,也需要初始化你所依赖的模块示例:

  //初始化MainComponent
    DaggerMainComponent
            .builder()
            .appComponent(((MyApplication)getApplication()).getAppComponent())
            .build()
            .in(this);

这些就是我入门的时候自己摸索的一些东西,如果有什么不足还望大家见谅和指出.

我踩过的坑:ButterKnife和Dagger2一起使用导致@BindView无法绑定对象,出现空指针异常.
解决方法:在app下的build.xml修改以下几个地方

android {
 ...
  //解决注解冲突
  packagingOptions {
      exclude 'META-INF/services/javax.annotation.processing.Processor'
  }
}
dependencies {
    //ButterKnife的注解器(灰色为原来的)
    //    annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
    compile 'com.jakewharton:butterknife-compiler:8.5.1'
    compile 'com.jakewharton:butterknife:8.5.1'
    //dagger2
    //    apt 'com.google.dagger:dagger-compiler:2.6'
    compile 'com.google.dagger:dagger:2.6'
    provided 'com.google.dagger:dagger-compiler:2.6'
}

我写的一个小DemoDagger2SimpleDemo

下面是我学习时的一些参考文章,从简单到难作了排序,如果想了解更多可以一个个点进去看.相信看了我这篇有了一个大概的概念,看他们就更容易理解了.

Dagger2 入门,以初学者角度
Android:dagger2让你爱不释手-基础依赖注入框架篇
Android:dagger2让你爱不释手-重点概念讲解、融合篇
Android:dagger2让你爱不释手-终结篇

下面是我推荐的一个结合当前很多比较火的技术的文章,它里面带有DEMO,大家可以参考.

MVP+Dagger2+Rxjava+Retrofit+GreenDao 小应用,包含新闻、图片、视频3个大模块,代码整洁干练

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容

  • 部分内容参考自:[Android]使用Dagger 2依赖注入 - DI介绍(翻译)[Android]使用Dagg...
    AItsuki阅读 47,110评论 66 356
  • 1.什么是dagger2 简单来说,dagger2是一个依赖注入框架,代替你生成实例,管理各种实例的依赖关系的库。...
    碧海鱼龙阅读 912评论 0 0
  • 本文的分析基于dagger2的2.7版本。 谷歌开发维护的Dagger2出来有很长时间了,目前在很多开源项目上也能...
    sososeen09阅读 13,580评论 31 108
  • Git作为目前最流行的版本控制系统,它的优点不言而喻,那么怎样去使用Git呢?对于初学者来说可能有一点的难度,再加...
    彬_仔阅读 1,394评论 6 61
  • 被人遗弃的废纸 和无家可归的猫 守着 用废纸做成的 无家可归的纸猫 它们说 我们好像啊 2017-10-30 日更...
    千鸟和她阅读 142评论 1 2