Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dagger2 Scope #85

Open
alwaystest opened this issue Jan 20, 2019 · 0 comments
Open

Dagger2 Scope #85

alwaystest opened this issue Jan 20, 2019 · 0 comments

Comments

@alwaystest
Copy link
Owner

alwaystest commented Jan 20, 2019

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());
  }

Href

johnnyshieh.me
薛瑄的博客

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant