文章目录
-
- 1.概述
- 2.DECLARING DEPENDENCIES(声明依赖)
- 3.满足依赖关系(SATISFYING DEPENDENCIES)
- 4.建图(BUILDING THE GRAPH)
- 5.单例(SINGLETONS)
- 6.懒加载(LAZY INJECTIONS)
- 7.PROVIDER INJECTIONS
- 8.限定符(QUALIFIERS)
- 9.静态注入(STATIC INJECTION)
- 10.编译时验证 (COMPILE-TIME VALIDATION)
- 11.编译时代码生成(COMPILE-TIME CODE GENERATION)
- 12.模块重写(MODULE OVERRIDES)
dagger官方文档
dagger1 git
1.概述
依赖注入(Dependency Injection)具体含义是:
当某个角色(一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在依赖注入器中,创建被调用者的工作不再由调用者来完成(控制反转)
Dagger作为工厂类的替代品,声明依赖、指定如何满足依赖、主导应用程序。基于JSR-330,方便每个类测试。依赖注入不仅仅用于测试,还便于创建可重用、可替换的模块。可在所有应用程序中共享相同的AuthenticationModule(验证模块),可在开发期间运行DevLoggingModule(开发者登录模块),并在生产环境中运行ProdLoggingModule(用户登录模块),以在每种场景下获得正确的行为
2.DECLARING DEPENDENCIES(声明依赖)
使用 javax.inject.Inject 注解来识别构造函数和属性:
(1)使用@Inject注解类的构造函数,当依赖注入构建实例时,Dagger会获得所需的参数值并调用此构造函数
import javax.inject.Inject;
class Thermosiphon implements Pump {
private final Heater heater;
@Inject
Thermosiphon(Heater heater) {
this.heater = heater;
}
@Override public void pump() {
if (heater.isHot()) {
System.out.println("=> => pumping => =>");
}
}
}
(2)Dagger直接注入属性:
import dagger.Lazy;
import javax.inject.Inject;
class CoffeeMaker {
@Inject Lazy<Heater> heater;
@Inject Pump pump;
public void brew() {
heater.get().on();
pump.pump();
System.out.println(" [_]P coffee! [_]P ");
heater.get().off();
}
}
若类中有@Inject注解在属性上,但没有构造函数使用@Inject注解,Dagger会使用无参数构造函数(存在无参构造函数)。
Dagger不支持方法注入。
3.满足依赖关系(SATISFYING DEPENDENCIES)
默认情况下,Dagger通过构造符合类型的实例来满足每个依赖。
当请求注入一个CoffeeMaker时,通过调用new CoffeeMaker()并设置可注入的属性。
@Inject并不适用于所有地方:
接口不能被构造;
第三方类不能被注解;
必须配置可配置对象。
对于不适用@Inject的情况,使用@ Provides注解方法来满足依赖。方法的返回类型定义了它所满足的依赖项。
在任何需要Heater的时候,调用provideHeater()方法

@Provides注解的方法可能有自己的依赖。当需要Pump 时,返回Thermosiphon :

所有@Provides注解的方法必须在一个模块中,有@Module标准的类

按照惯例,@Provides注解的方法方法名使用前缀provide,而模块类的类名使用后缀Module。
4.建图(BUILDING THE GRAPH)
@Inject和@ Provides注释的类形成了一张通过依赖连接的对象图。通过调用ObjectGraph.create()获得此图,该函数接受一个或多个模块作为参数:

为了使用图,需要引导注

最低0.47元/天 解锁文章
1368

被折叠的 条评论
为什么被折叠?



