dagger2笔记

学习链接: http:\/\/google.github.io\/dagger\/users-guide.html

dagger2(以下简称dagger)作为一种全局模块,对项目进行了二次编码,从而简化了开发,但是也提高了理解一个项目的难度.

dagger运作方式理解:

首先,对于在项目中需要在其他模块或者类中重复使用的类,生命为依赖,编译时,dagger会生成该类的实例.对于需要使用该类的类,只需要生命需要该类,则可以直接使用该类的方法.

第一步:声明为其他类提供依赖.通过对类的构造方法\类的声明对象(Field)使用@Inject注释,或者通过对返回类的实例的方法使用@Providers注解.注意,所有的Providers方法属于一个模块,模块类使用@Module来声明.

第二步:

  • 优点:

    • Dagger通过实现依赖注入,替代了工厂类,以后不用写一大堆的模板方法;
    • 由于使用jrs330标准,很容易测试;
    • 使创建能够重用,易于改变的模块更加方便;->如全局类,和不同场景下的运行类
  • 1.声明依赖 通过对需要的类和声明加入@Inject注解,dagger就能够构造你应用中需需要的类和类的声明. 通过对于需要的类和类的声明加@Inject注解来声明, 对类的构造方法加@Inject注解,需要类的实例时,dagger就能得到需要的参数并调用构造函数生成实例.

    eg:

    class Thermosiphon implements Pump {
    private final Heater heater;
    @Inject
    Thermosiphon(Heater heater) {
          this.heater = heater;
    }
    

    在声明对象的时候注入对象,这样dagger就会获得该类的对象的引用. 但是如果没有注入该类的构造方法,那么dagger不会创建新的对象.在注入对象之前,该引用是一个空值. 对默认构造方法声明注入也会创建该类的对象; `class CoffeeMaker {

      @Inject Heater heater;
    

    }` 也可以注入方法,但是推荐注入类的构造方法和类的声明; dagger无法创建未使用@Inject注解的类.

  • 2.满足依赖 默认情况下,声明了多少依赖,dagger就会调用多少个依赖的构造方法来创建实例, (dagger将会通过调用每个被声明依赖的类的构造方法,构造所需要类型的实例),以满足每一个依赖. 但是下述情况下,依赖无法使用:

    • 接口无法被实例化;
    • 已编译的第三方类不能使用注解
    • 配置型的对象必须使用配置方法,而不是注解

    这些情况下,@Inject就不适用了,我们应该使用@Provides注解,对方法使用@Provides注解以满足依赖.方法的返回值将会提供一个实例化后的类. eg:

    @Provides static Heater provideHeater() {
      return new ElectricHeater();
    }
    

    @Provides声明的方法,能够拥有自己的依赖.

    方法可以拥有自己实例化后的类.

    所有依赖方法必须属于一个模块,模块类使用@Module注解声明. 通常来说,依赖方法以provide作为前缀,模块类使用Module作为后缀.

  • 3.构建依赖图结构

results matching ""

    No results matching ""