Dagger2入门探索

作者: cpMark | 来源:发表于2017-03-29 23:55 被阅读0次

    在开始使用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个大模块,代码整洁干练

    相关文章

      网友评论

        本文标题:Dagger2入门探索

        本文链接:https://www.haomeiwen.com/subject/jifyottx.html