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.构建依赖图结构