Dagger2学习从这里开始

什么是Dagger2?

Dagger2是Dagger的升级版,是一个依赖注入框架,现由Google接手维护。 先需理解什么是依赖注入,才能更好的理解Dagger2。

依赖注入是面向对象编程的一种设计模式,其目的是为了降低程序耦合,这个耦合就是类之间的依赖引起的。

例如:我们在写Android程序时,在一个类中引用另一个类,从而可以调用引用的类的方法完成某些功能 ;

ListView、RecyclerView大家都是有接触过的,其中Adapter创建好之后,若在Activity的类中进行使用,需要通过构造方法进行调用引用,有时候我们并不能把所有参数都考虑周全,把适配器写好,若适配器可以复用或产品迭代需要新的参数时,往往修改一个地方,其它地方可能也要面临大改,为了降低这种高频的程序耦合(解耦),Dagger2很好的解决了我们实际开发中的问题。

public class ClassA {
    ...
    ClassB b;
    ...
    public ClassA() {
        b = new ClassB();
    }

    public void do() {
        ...
        b.doSomething();
        ...
    }
}

换句话也就是说,ClassA依赖于ClassB,必须借助ClassB的方法,才能完成一些功能。这样看好像并没有什么问题,但是我们在ClassA的构造方法里面直接创建了ClassB的实例,问题就出现在这,在ClassA里直接创建ClassB实例,违背了单一职责原则,ClassB实例的创建不应由ClassA来完成;其次耦合度增加,扩展性差,如果我们想在实例化ClassB的时候传入参数,那么不得不改动ClassA的构造方法,不符合开闭原则

因此我们需要一种注入方式,将依赖注入到宿主类(或者叫目标类)中,从而解决上面所述的问题。依赖注入有一下几种方式:

☆通过接口注入
interface ClassBInterface {
      void setB(ClassB b);
  }

  public class ClassA implements ClassBInterface {
      ClassB classB;

      @override
      void setB(ClassB b) {
          classB = b;
      }
  }
☆通过set方法注入
  public class ClassA {
      ClassB classB;

      public void setClassB(ClassB b) {
          classB = b;
      }
  }
☆通过构造方法注入
  public class ClassA {
      ClassB classB;

      public void ClassA(ClassB b) {
          classB = b;
      }
☆通过Java注解

  public class ClassA {
      //此时并不会完成注入,还需要依赖注入框架的支持,如RoboGuice,Dagger2
      @inject ClassB classB;

      ...
      public ClassA() {}
其中,在Dagger2中引用的就是最后的一种注入方式,通过注解的方式,将依赖注入到宿主类中。

如何使用Dagger2?

配置apt插件(在build.gradle(Project:xxx)中添加如下代码)
dependencies {
      classpath 'com.android.tools.build:gradle:2.1.0'
      //添加apt插件
      classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

  }
添加依赖(在build.gradle(Module:app)中添加如下代码)
apply plugin: 'com.android.application'
  //添加如下代码,应用apt插件,添加apt命令
  apply plugin: 'com.neenbedankt.android-apt'
  ...
  dependencies {
      ...
      //dagger2
      compile 'com.google.dagger:dagger:2.4' //dagger公用api
      apt 'com.google.dagger:dagger-compiler:2.4' //指定注解处理器
      compile 'org.glassfish:javax.annotation:10.0-b28' //java注解 添加Android缺失的部分Javax注解
      ...
  }
注意:Android Studio 3.0  干掉了apt,详情请点击——》 Android Studio升级至3.0所遇到的问题

你该知道:
@Inject:
通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
@Module:
Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例时候,就知道从哪里去找到需要的依赖。Modules的一个重要特征是他们设计为分区并组合在一起(比如说,我们的app中可以有多个组成在一起的modules)。
@Provide:
在modules中,我们定义的方法时用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Component:
Commponents从根本上说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的。

 
    
注解 用法
@Module Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,在我们的app中可以有多个组成在一起的modules)
@Provide 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
@Singleton 当前提供的对象将是单例模式 ,一般配合@Provides一起出现
@Component 用于接口,这个接口被Dagger2用于生成用于模块注入的代码
@Inject 在需要依赖的地方使用这个注解。(你用它告诉Dagger这个 构造方法,成员变量或者函数方法需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。)
@Scope Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。


内容源自网络,仅供学习参考,待完善~~~

猜你喜欢

转载自blog.csdn.net/diminess/article/details/78119176