Blog
Blog copied to clipboard
Dagger2 Scope
Dagger2 Scope
Dagger2 使用注解处理器在运行时生成代码完成依赖注入的功能。
Key Concept
- Module 真正生成依赖对象的方法,类似于 Factory.
- Component Dagger2 对外暴露的接口,通过生成一个实现对应 Component 接口的类,实现依赖注入的功能。
Process
利用 Annotation Processor Tool 在编译时处理 @Component
注解的 Interface。
Annotation 就是一个携带信息的标记,在处理注解时,可以通过读取 Annotation 中携带的信息,得知生成 Component 时所需的依赖 Module。
Component 组合各种 Module 对外提供依赖注入能力。 Module 提供实际的对象生产能力。
自定义 Scope
类似于文档,提供一个更加直观的生命周期说明。但是并不对应特殊实现,具体实现交给开发者。 便于处理依赖之间的生命周期关系。
自定义 Scope 是为了更好的管理 Component 和 Module 之间的关系,Component 和 Component 之间的依赖和继承关系。
因为 Dagger2 中的 Scope 保证的是 Component 和 生成的依赖对象的生命周期相同,所以自定义 Scope 提供了类似 Lint 的功能,一旦 Component 声明的生命周期和 Module 中声明的 Scope 不同,编译时就会报错,起到检测的作用。
作用域的原理,其实是让生成的依赖实例的生命周期与 Component 绑定。
Dagger 如何知道 Scope 是自定义的
// dagger/java/dagger/internal/codegen/Scopes.java
/** Returns all of the associated scopes for a source code element. */
static ImmutableSet<Scope> scopesOf(Element element) {
return AnnotationMirrors.getAnnotatedAnnotations(element, javax.inject.Scope.class)
.stream()
.map(Scope::scope)
.collect(toImmutableSet());
}